如何从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"'