我已经尝试了一段时间并相信我对此非常接近,但我对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 '{}' ';'
解压缩,但将它们解压缩到当前工作目录中,我希望它们解压缩到位。我也不理解这个我想要学习的命令。
非常感谢任何帮助。
谢谢,
答案 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
代替-exec
,find
在找到文件的目录中运行命令,而不是运行find . -name '*.zip' -execdir unzip '{}' ';'
的目录。
{{1}}
答案 2 :(得分:7)
find . -name '*.zip' | xargs -n1 unzip