递归解压缩文件,然后删除原始文件,从shell中保留解压缩的文件

时间:2011-04-08 04:18:52

标签: bash unzip rm

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

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

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

5 个答案:

答案 0 :(得分:11)

你试过了吗?

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 {} \;   

答案 1 :(得分:8)

用-delete获取第二个命令的thx!帮助了我很多.. 我身边只有2条(可能是有用的)评论:

- 要使用' .zip' 而不是` .zip` 在我的debian系统上

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

找到。 -depth -name'* .zip' -execdir / usr / bin / unzip -n {} \; -delete

THX&问候, 诺德

答案 2 :(得分:3)

如上所述,这应该有用。

找到。 -depth -name'* .zip'-execdir unzip -n {} \; -delete

但请注意两件事:

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

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

答案 3 :(得分:0)

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

for F in $(find . -depth -name *.zip); do unzip "$F" -d "${F%.*}/" && rm "$F"; done

答案 4 :(得分:0)

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

为此,我使用:

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

它的工作原理是搜索和扩展目录中的所有zip文件。稍后,在完成后,可能会有新的解压缩的新文件混合在那里,但尚未删除。

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