12

到目前为止,我已经弄清楚如何使用 find 递归解压缩所有文件:

find . -depth -name `*.zip` -exec /usr/bin/unzip -n {} \; 

但是,我不知道如何在提取后一次删除一个 zip 文件。在 -a -exec 中添加 rm *.zip 最终会在每个目录中的大多数 zip 文件被提取之前删除它们。通过包含 rm 命令的脚本(启用 -i 进行测试)会导致 find 找不到任何 *.zips (或者至少这是它所抱怨的)。当然,许多文件名中都有空格,但此时在 sed 命令中添加 _ 的语法有点超出我的理解。感谢您的帮助!

4

5 回答 5

14

你有没有尝试过:

find . -depth -name '*.zip' -exec /usr/bin/unzip -n {} \; -exec rm {} \;

或者

find . -depth -name '*.zip' -exec /usr/bin/unzip -n {} \; -delete

或在解压缩后运行第二个查找

find . -depth -name '*.zip' -exec rm {} \;   
于 2011-04-08T04:41:39.343 回答
10

thx 使用 -delete 的第二个命令!帮了我很多..我身边只有2(也许有帮助)评论:

-必须在我的 debian 系统上使用.zip”而不是 .zip ”

-use -execdir而不是-exec > 这将提取当前文件夹中的每个 zip 文件,否则您最终会在调用 find cmd 的目录中获得所有提取的内容。

寻找 。-depth -name '*.zip' -execdir /usr/bin/unzip -n {} \; -删除

THX 和问候,诺德

于 2012-03-17T17:21:55.560 回答
4

如上所述,这应该有效。

寻找 。-depth -name '*.zip' -execdir unzip -n {} \; -删除

但是,请注意两点:

  • -n选项指示 unzip 不覆盖现有文件。您可能不知道 zip 文件是否与名称相似的目标文件不同。即使这样,-delete也会删除 zip 文件。
  • 如果 unzip 无法解压缩文件——比如因为错误——它可能仍然会删除它。如果-exec rm {} \;该命令肯定会删除它 用于代替-delete

更安全的解决方案可能是将解压缩后的文件移动到单独的目录中,当您确定已成功解压缩所有文件时,您可以将其丢弃。

于 2013-12-15T02:05:36.480 回答
2

根据文件名 (../file.zip -> ../file/..) 解压缩子目录中的档案:

for F in $(find . -depth -name *.zip); do unzip "$F" -d "${F%.*}/" && rm "$F"; done
于 2015-05-20T02:26:51.640 回答
0

我有一个目录,里面填满了压缩的 csv 文件。外部进程经常向其写入新的压缩文件。我希望像您一样批量解压缩并删除原件。

为此,我使用:

    unzip '*.zip'
    find . | sed 's/$/\.zip/g' | xargs -n 1 rm 

它通过搜索和扩展目录中当前的所有 zip 文件来工作。稍后,在它完成后,可能还会有新的解压缩新文件混合在其中,这些文件还没有被删除。

所以我通过找到成功解压缩的 *.csv 文件来删除,并使用 sed 重新生成要删除的原始文件名,然后通过 xargs 命令将其馈送到 rm 。

于 2016-03-31T23:03:29.770 回答