14

我已经尝试了一段时间,相信我已经很接近这个了,但是我对 Unix 还很陌生,所以一直觉得这很困难。

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

例如我有:

文件/A/something.java

文件/B/somezipfile.zip

文件/C/someotherfile.zip

文件/D/AnotherZipFile.zip

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

文件/B/javafile.java

文件/C/someotherfilefromzip.java

文件/D/Anotherfile.java

我不介意解压缩后 ZIP 文件是否保留或被删除,两者都可以。

到目前为止我所尝试的。

1)我希望我可以使用我不熟悉的管道,如下所示:

find . -name *.zip | unzip

这行不通。

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

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

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

任何帮助深表感谢。

谢谢,

4

3 回答 3

46
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>

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

`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 \"{}\"`" "{}"' ';'
于 2013-02-11T13:45:36.567 回答
37

使用-execdir而不是-exec,它在找到文件的目录中运行命令,而不是在您运行的目录find中。

find . -name '*.zip' -execdir unzip '{}' ';'
于 2013-02-11T14:17:55.550 回答
9
find . -name '*.zip' | xargs -n1 unzip
于 2013-02-11T13:54:46.383 回答