找到所有 zip,并就地解压 - Unix

问题描述 投票:0回答:4

我已经尝试了一段时间,相信我已经相当接近这个目标了,但我对 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 '{}' ';'

这会解压缩,但会将它们解压缩到当前工作目录中,我希望它们解压缩到位。我也不明白这个命令,因为我正在努力学习,所以我想理解它。

非常感谢任何帮助。

谢谢,

shell unix find zip unzip
4个回答
53
投票
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 \"{}\"`" "{}"' ';'

43
投票

使用

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

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

9
投票
find . -name '*.zip' | xargs -n1 unzip

0
投票

您可能希望将每个

foo/bar.zip
文件中包含的文件提取到
foo/bar/
目录下。

find . -name '*.zip' -exec sh -c 'unzip -d "`dirname \"{}\"`"/"`basename \"{}\" .zip`" "{}"' ';'
© www.soinside.com 2019 - 2024. All rights reserved.