如何从Unix命令行递归解压缩目录及其子目录中的归档文件?
时间:2020-03-06 14:28:57 来源:igfitidea点击:
unzip
命令没有用于递归解压缩档案的选项。
如果我具有以下目录结构和档案:
/Mother/Loving.zip /Scurvy/Sea Dogs.zip /Scurvy/Cures/Limes.zip
我想将所有档案解压缩到与每个档案同名的目录中:
/Mother/Loving/1.txt /Mother/Loving.zip /Scurvy/Sea Dogs/2.txt /Scurvy/Sea Dogs.zip /Scurvy/Cures/Limes/3.txt /Scurvy/Cures/Limes.zip
我会发出什么命令?
重要的是,不要使其中包含空格的文件名阻塞。
解决方案
这是一个涉及find命令和while循环的解决方案:
find . -name "*.zip" | while read filename; do unzip -o -d "`basename -s .zip "$filename"`" "$filename"; done;
像使用-r标志的gunzip之类的东西吗?
递归地移动目录结构。如果在命令行上指定的任何文件名都是目录,则gzip将下降到该目录并压缩在该目录中找到的所有文件(如果是gunzip,则将其解压缩)。
http://www.computerhope.com/unix/gzip.htm
我们可以在单个命令行中将find与-exec标志一起使用来完成此工作
find . -name "*.zip" -exec unzip {} \;
如果我们使用的是cygwin,则basename命令的语法略有不同。
find . -name "*.zip" | while read filename; do unzip -o -d "`basename "$filename" .zip`" "$filename"; done;
如果要将文件解压缩到相应的文件夹中,可以尝试此操作
find . -name "*.zip" | while read filename; do unzip -o -d "`dirname "$filename"`" "$filename"; done;
适用于可以处理高I / O的系统的多进程版本:
find . -name "*.zip" | xargs -P 5 -I fileName sh -c 'unzip -o -d "$(dirname "fileName")/$(basename -s .zip "fileName")" "fileName"'