找到所有拉链,并解压缩到位 - Unix

The*_*son 12 unix shell zip unzip find

我已经尝试了一段时间并相信我非常接近这一点,但我对Unix相当新,所以一直觉得这很困难.

我有一个文件夹,包含许多文件夹,其中一些文件夹中包含zip文件,有些文件夹没有.我试图解压缩任何子目录中的所有zip文件.

例如,我有:

文件/ A/something.java

文件/ B/somezipfile.zip

文件/ C/someotherfile.zip

文件/ d/AnotherZipFile.zip

我想解压缩它们(假设zips包含.java文件),得到如下结果:files/A/something.java

文件/ B/javafile.java

文件/ C/someotherfilefromzip.java

文件/ d/Anotherfile.java

我不介意ZIP文件在解压缩后是保留还是删除,也不错.

到目前为止我尝试过的.

1)我预计我可以使用管道,我是新手,像这样:

find . -name *.zip | unzip
Run Code Online (Sandbox Code Playgroud)

这不起作用.

2)我花了一些时间搜索,我在网上使用解决方案的最接近的是:

find . -name '*.zip' -exec unzip '{}' ';'
Run Code Online (Sandbox Code Playgroud)

解压缩,但将它们解压缩到当前工作目录中,我希望它们解压缩到位.我也不理解这个我想要学习的命令.

任何帮助深表感谢.

谢谢,

Mik*_*rov 35

find . -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';'
Run Code Online (Sandbox Code Playgroud)

此命令以递归方式查找当前目录及其子目录中名称与*.zip模式匹配的文件.对于找到的文件,它sh使用两个参数执行命令:

-c
Run Code Online (Sandbox Code Playgroud)

unzip -d `dirname <filename>` <filename>
Run Code Online (Sandbox Code Playgroud)

<filename>找到的文件名称在哪里.命令sh是Unix shell解释器.Option -c告诉shell下一个参数应该被解释为shell脚本.所以shell解释以下脚本:

unzip -d `dirname <filename>` <filename>
Run Code Online (Sandbox Code Playgroud)

在运行unzipshell 之前,通过进行各种替换来扩展命令.在这个特定的例子中它替代

`dirname <filename>`
Run Code Online (Sandbox Code Playgroud)

输出命令dirname <filename>,实际输出放置文件的目录名.所以,如果文件名是./a/b/c/d.zip,shell会unzip像这样擦:

unzip -d ./a/b/c ./a/b/c/d.zip
Run Code Online (Sandbox Code Playgroud)

如果ZIP文件名或目录名有空格,请使用:

find . -name '*.zip' -exec sh -c 'unzip -d "`dirname \"{}\"`" "{}"' ';'
Run Code Online (Sandbox Code Playgroud)

  • 如果 zips 文件名中存在空格,我似乎会遇到问题,是否有简单的解决方法? (2认同)
  • @NutterzUK是的,这很容易解决。只需添加引号。请参阅我对答案的最后补充。 (2认同)

che*_*ner 31

使用-execdir而不是-exec在找到文件的目录中运行命令,而不是运行目录find.

find . -name '*.zip' -execdir unzip '{}' ';'
Run Code Online (Sandbox Code Playgroud)

  • 工作出色。您介意解释`'{}'的作用(文件名占位符吗?)以及为什么`';'`需要用引号引起来吗?谢谢! (3认同)

Jos*_*lly 7

find . -name '*.zip' | xargs -n1 unzip
Run Code Online (Sandbox Code Playgroud)