找到所有拉链,并解压缩到位 - Unix

时间:2013-02-11 13:36:10

标签: shell unix find zip unzip

我已经尝试了一段时间并相信我对此非常接近,但我对Unix相当新,所以一直觉得这很困难。

我有一个文件夹,其中包含许多文件夹,其中一些文件夹中包含zip文件,有些则没有。我试图解压缩任何子目录中的所有zip文件。

例如我有:

文件/ A / something.java

文件/ B / somezipfile.zip

文件/ C / someotherfile.zip

文件/ d / AnotherZipFile.zip

我想解压缩它们(假设拉链只包含.java文件),得到如下结果: 文件/ A / something.java

文件/ B / javafile.java

文件/ C / someotherfilefromzip.java

文件/ d / Anotherfile.java

我不介意在解压缩后是否保留或删除ZIP文件,这两种情况都可以。

到目前为止我的尝试。

1)我希望我可以使用管道,我是新手,像这样:

find . -name *.zip | unzip

这不起作用。

2)我花了一些时间搜索,我在网上使用解决方案的最接近的是:

find . -name '*.zip' -exec unzip '{}' ';'

解压缩,但将它们解压缩到当前工作目录中,我希望它们解压缩到位。我也不理解这个我想要学习的命令。

非常感谢任何帮助。

谢谢,

3 个答案:

答案 0 :(得分:34)

find . -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';'

此命令以递归方式查找当前目录及其子目录中名称与*.zip模式匹配的文件。对于找到的文件,它使用两个参数执行命令sh

-c

unzip -d `dirname <filename>` <filename>

其中<filename>是找到的文件的名称。命令sh是Unix shell解释器。选项-c告诉shell下一个参数应该被解释为shell脚本。所以shell解释了以下脚本:

unzip -d `dirname <filename>` <filename>

在运行unzip shell之前,通过进行各种替换来扩展命令。在这个特定的例子中,它替代了

`dirname <filename>`

输出命令dirname <filename>,它实际输出放置文件的目录名。因此,如果文件名为./a/b/c/d.zip,则shell会像这样擦除unzip

unzip -d ./a/b/c ./a/b/c/d.zip

如果ZIP文件名或目录名有空格,请使用:

find . -name '*.zip' -exec sh -c 'unzip -d "`dirname \"{}\"`" "{}"' ';'

答案 1 :(得分:27)

使用-execdir代替-execfind在找到文件的目录中运行命令,而不是运行find . -name '*.zip' -execdir unzip '{}' ';' 的目录。

{{1}}

答案 2 :(得分:7)

find . -name '*.zip' | xargs -n1 unzip