2014-01-15 160 views
1

在bash命令行中,我必须找到名称与我的系统中某个特定模式相匹配的所有zip文件,然后将它们解压缩到我的目录中。xargs oneliner解压缩文件

我想组织子文件夹中的解压缩文件,我想选择我的子文件夹名称与基于原始zip文件名称(不使用完整路径)的自定义命名约定。

我知道周期的工作,无论如何,因为我现在正在学习xargs,我想知道我是否可以在xargs oneliner中做同样的事情;类似于:

locate -r "<zipped files regex>" | xargs -i -t "foldername=$(echo {} | sed 's/.*\///'); mkdir -p $folderName; unzip {} -d $folderName" 

我得到这个消息:

foldername={}; mkdir -p ; unzip {} -d 
xargs: foldername={}; mkdir -p ; unzip {} -d : No such file or directory 

你能帮我做工作?

谢谢!

+0

当前命令的问题究竟是什么?另外,您是否可以提供一个来自{}>的

+1

Xargs将所有内容传递给一个zip命令,zip一次只能处理一个zip文件,因此您应该使用for-loop或'find ... -exec'。 –

+0

@SamiLaine好点,但'xargs'有'-n'('--max-args')选项。尽管如此,使用带'-exec'的'find'更直接。 –

回答

2

$()之内的echo {} | sed 's/.*\///'在xargs之前和之前的任何其他位置之前被执行并且在定位之前。所以用xargs很难做到这一点。不使用xargs的一种方式:

locate -r [.]zip$ | \ 
    sed 's!.*/\([^/]*\)$!mkdir -p "\1"; unzip -n -d "\1" "&";!' | \ 
    sh 2> ERRORS 
+0

我不知道sed的这种用法,绝对聪明的解决方案!谢谢! –

+0

这有效地使'sed'成为一个更智能,更强大的'xargs' – CygnusX1

0

使用GNU并行以提高可读性,并可能加速比:

locate -r [.]zip$ | parallel "mkdir -p {/.}; cd {/.} && unzip {}" 

手表简要介绍介绍视频: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

穿行教程( man parallel_tutorial)。你命令行 爱你。