2011-04-08 85 views
8

留解压缩的文件代替我到目前为止已经找到了如何使用find递归解压缩所有文件:递归解压缩文件,然后删除原始文件,从外壳

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

但是,我不能了解如何在提取后一次删除一个zip文件。在-a -exec中添加rm * .zip最终将删除每个目录中的大部分zip文件,然后将其解压。通过包含rm命令的脚本(使用-i启用测试)进行管道操作会导致发现找不到任何* .zips(或者至少这是它所投诉的内容)。当然,在许多文件名中都有空格,但是在这个时候,在sed命令中添加_的语法有点超出我的意思。感谢您的帮助!

+0

你是什么意思'递归',zip在zip?对于复杂的任务,我会亲自编写一个助手脚本(比如'unzip-and-rm.sh')和-exec脚本。 – 2011-04-08 04:26:39

+0

如果我不够清楚,我很抱歉。目录树至少有六到七个级别,zip文件处于最深的级别。每个zip文件包含两个其他文件,我希望保持其他文件不变,但随后删除zip文件。我原来的尝试只是将'unzip-and-rm'插入脚本并执行它,但它找不到任何zip文件,我怀疑这是由于文件名中的空格造成的。 – Ben 2011-04-08 04:33:05

+0

我不知道为什么'它找不到任何zip文件',我无法相信它,你能粘贴命令行吗? – 2011-04-08 04:47:13

回答

9

你尝试过:

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

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

或-delete的解压后运行的第二个find一个

find . -depth -name '*.zip' -exec rm {} \; 
+0

我得到一个'find:路径必须在表达式之前:/ usr/bin/unzip'。 – Ben 2011-04-08 04:45:13

+0

请尝试其他选项 – ggiroux 2011-04-08 04:48:43

+0

啊!第二个选项完美运作。 ' - 删除',我永远不知道你们!当然,我忘记提及的一个主要标准是解压缩和删除应该紧接着发生,因为该驱动器不够大,无法解压所有内容,然后又回到删除。非常感谢! – Ben 2011-04-08 04:51:58

7

THX的第二个命令!帮了我很多.. 仅有2(也许有用)从我身边备注:

-had使用'.ZIP' 的代替` .zip`我的Debian系统上

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

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

THX &问候, 北

2

正如上面提到的,这应该工作。

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

但是,请注意两两件事:

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

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

0

在子目录解压缩档案基于文件名(../file.zip - > ../file/ ..):

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

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

为了做到这一点我用:

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

它通过搜索和目录目前展开所有zip文件。稍后,完成后,可能会有新的解压缩新文件混合在那里,但尚未删除。

所以我删除找到成功 unzipped * .csv文件,并使用sed重新生成原始文件名删除,然后通过xargs命令提供给rm。