【问题标题】:Find all zips, and unzip in place - Unix找到所有的压缩包,并在原地解压 - Unix
【发布时间】:2013-02-11 13:36:09
【问题描述】:

我已经尝试了一段时间,相信我已经很接近这个了,但我对 Unix 还很陌生,所以一直觉得这很困难。

我有一个文件夹,其中包含许多文件夹,其中一些包含 zip 文件,而另一些则没有。我正在尝试解压缩任何子目录中的所有 zip 文件。

例如我有:

文件/A/something.java

文件/B/somezipfile.zip

文件/C/someotherfile.zip

文件/D/AnotherZipFile.zip

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

文件/B/javafile.java

files/C/someotherfilefromzip.java

files/D/Anotherfile.java

我不介意ZIP文件在解压缩后是保留还是删除,都可以。

到目前为止我已经尝试过什么。

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

find . -name *.zip | unzip

这不起作用。

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

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

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

非常感谢任何帮助。

谢谢,

【问题讨论】:

    标签: shell unix find zip unzip


    【解决方案1】:
    find . -name '*.zip' -exec sh -c 'unzip -d `dirname {}` {}' ';'
    

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

    -c
    

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

    &lt;filename&gt; 是找到的文件的名称。命令sh 是 Unix shell 解释器。选项-c 告诉shell 下一个参数应该被解释为shell 脚本。所以shell解释了以下脚本:

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

    在运行unzip 之前,shell 通过执行各种替换来扩展命令。在这个特定的例子中,它替代了

    `dirname <filename>`
    

    带有命令dirname &lt;filename&gt; 的输出,它实际输出放置文件的目录名称。所以,如果文件名是./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 \"{}\"`" "{}"' ';'
    

    【讨论】:

    • 这看起来是一个很好的答案,你有没有机会(很快)帮助我理解它?我对 -exec 和 {} 标记的需要感到困惑。
    • 如果 zips 文件名中有空格,我似乎有问题,有没有简单的解决方法?
    • @NutterzUK 是的,这很容易解决。只需要添加引号。请参阅我对答案的最后补充。
    【解决方案2】:

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

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

    【讨论】:

    • 工作出色。你介意解释一下'{}' does (filename placeholder?) and why the ';'` 需要单独引用吗?谢谢!
    • {} 表示您正在操作的当前文件
    【解决方案3】:
    find . -name '*.zip' | xargs -n1 unzip
    

    【讨论】:

    • 这似乎无法处理unzip 中的选项,例如find . -name '*.zip' | xargs -n1 unzip -q ?
    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 2020-07-16
    • 2010-10-15
    • 2011-02-17
    • 1970-01-01
    相关资源
    最近更新 更多