找到所有拉链,并在地方解压 - 的Unix(Find all zips, and unzip in

2019-07-19 17:48发布

我一直在尝试了一段时间,相信我是相当接近,但我是相当新的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 '{}' ';'

这种解压,但他们解压缩到当前的工作目录,我希望他们在地方解压。 我也弄不明白这个命令,我想,因为我努力学习。

任何帮助深表感谢。

谢谢,

Answer 1:

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

此命令在当前目录及其子目录中的递归文件的外观相匹配的名字*.zip模式。 对于文件中找到它执行命令sh有两个参数:

-c

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

其中<filename>是被发现的文件名。 命令sh是Unix shell的解释。 选项-c告诉外壳,一个参数应该被解释为shell脚本。 所以shell解释下面的脚本:

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

之前运行unzip外壳扩展命令,做不同的替换。 在这个特殊的例子是取代

`dirname <filename>`

与命令的输出dirname <filename>这实际上输出,其中文件被放置目录名。 所以,如果文件名是./a/b/c/d.zip ,外壳会擦unzip这样的:

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

如果您ZIP文件名或目录名有空格,用这个:

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


Answer 2:

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

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


Answer 3:

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


文章来源: Find all zips, and unzip in place - Unix