到目前为止,我已经想出了如何使用find递归解压缩所有文件:
find . -depth -name `*.zip` -exec /usr/bin/unzip -n {} \;
但是,我无法弄清楚如何在提取后一次删除一个zip文件。在-a -exec中添加rm * .zip会在提取之前删除每个目录中的大多数zip文件。通过包含rm命令的脚本(使用-i启用测试)管道导致找不到任何* .zips(或者至少是它所抱怨的)。当然,在许多文件名中都有空格,但此时在sed命令中添加_的语法有点超出我的意思。谢谢你的帮助!
答案 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)
- 要使用' .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 强>
但请注意两件事:
更安全的解决方案可能是将解压缩后的文件移动到一个单独的目录,当您确定已成功提取所有文件时,可以将其删除。
答案 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。