从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
你能帮助我让它发挥作用吗?
谢谢!
答案 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)。你命令行 爱你吧。