我已经尝试了一段时间,相信我已经相当接近这个目标了,但我对 Unix 相当陌生,所以发现这很困难。
我有一个文件夹,其中包含许多文件夹,其中一些文件夹中有 zip 文件,有些则没有。我正在尝试将所有子目录中的所有 zip 文件解压到位。
例如我有:
文件/A/something.java
文件/B/somezipfile.zip
文件/C/someotherfile.zip
文件/D/AnotherZipFile.zip
我想解压它们(假设 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 '{}' ';'
这会解压缩,但会将它们解压缩到当前工作目录中,我希望它们解压缩到位。我也不明白这个命令,因为我正在努力学习,所以我想理解它。
非常感谢任何帮助。
谢谢,
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 \"{}\"`" "{}"' ';'
使用
-execdir
而不是 -exec
,这会在找到文件的目录中运行命令,而不是您运行 find
的目录。
find . -name '*.zip' -execdir unzip '{}' ';'
find . -name '*.zip' | xargs -n1 unzip
您可能希望将每个
foo/bar.zip
文件中包含的文件提取到 foo/bar/
目录下。
find . -name '*.zip' -exec sh -c 'unzip -d "`dirname \"{}\"`"/"`basename \"{}\" .zip`" "{}"' ';'