xargs one liner to unzip files

时间:2014-01-15 10:36:22

标签: bash xargs

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

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

我知道 for 循环无论如何,因为我现在正在学习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

你能帮助我让它发挥作用吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

echo {} | sed 's/.*\///'内的$()在xargs之前和locate之前执行。所以用xargs很难做到这一点。不使用xargs的一种方法:

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

答案 1 :(得分:0)

使用GNU Parallel提高可读性并加速:

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

观看介绍视频以获得快速介绍: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

完成教程(man parallel_tutorial)。你命令行 爱你吧。