我一直在尝试了一段时间,相信我是相当接近,但我是相当新的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 '{}' ';'
这种解压,但他们解压缩到当前的工作目录,我希望他们在地方解压。 我也弄不明白这个命令,我想,因为我努力学习。
任何帮助深表感谢。
谢谢,
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 \"{}\"`" "{}"' ';'
使用-execdir
代替-exec
,运行该文件中找到的目录中的命令,而不是在运行目录下find
的。
find . -name '*.zip' -execdir unzip '{}' ';'
find . -name '*.zip' | xargs -n1 unzip