Bash 递归地解压文件,然后删除原始文件,将解压后的文件保留在shell中

Bash 递归地解压文件,然后删除原始文件,将解压后的文件保留在shell中,bash,unzip,rm,Bash,Unzip,Rm,到目前为止,我已经知道如何使用find递归解压缩所有文件: find . -depth -name `*.zip` -exec /usr/bin/unzip -n {} \; 但是,我不知道如何在提取后一次删除一个zip文件。在-a-exec中添加rm*.zip会在提取每个目录中的大部分zip文件之前将其删除。通过包含rm命令的脚本进行管道传输(为测试启用了-i)会导致find找不到任何*.zip(或者至少它会抱怨这一点)。当然,许多文件名中都有空格,但在这一点上,在sed命令中进行语法转换

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

find . -depth -name `*.zip` -exec /usr/bin/unzip -n {} \; 
但是,我不知道如何在提取后一次删除一个zip文件。在-a-exec中添加rm*.zip会在提取每个目录中的大部分zip文件之前将其删除。通过包含rm命令的脚本进行管道传输(为测试启用了-i)会导致find找不到任何*.zip(或者至少它会抱怨这一点)。当然,许多文件名中都有空格,但在这一点上,在sed命令中进行语法转换以添加u有点超出我的理解范围。谢谢你的帮助

您是否尝试过:

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

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

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

第二个命令的thx与-delete!帮了我很多忙。。 我只说了两句话(也许有帮助):

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

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

查找-depth-name'*.zip'-execdir/usr/bin/unzip-n{}-删除

THX和问候,
诺德

如上所述,这应该是可行的

查找-depth-name'*.zip'-execdir解压-n{}\-删除

但是,请注意两件事:

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

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

根据文件名(../file.zip->../file/)解压SubDR中的存档文件:


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

为此,我使用:

    unzip '*.zip'
    find . | sed 's/$/\.zip/g' | xargs -n 1 rm 
它的工作原理是搜索和扩展目录中当前的所有zip文件。稍后,在它完成后,可能会有新的解压的新文件混合在那里,它们还没有被删除


因此,我通过查找成功解压的*.csv文件来删除,并使用sed重新生成原始文件名以进行删除,然后通过xargs命令将原始文件名提供给rm。

递归地
,zip-in-zip是什么意思?对于复杂的任务,我个人会编写一个助手脚本(比如
解压和rm.sh
)并执行该脚本。如果我不够清楚,我很抱歉。目录树至少向下六到七层,zip文件位于最深的层。每个zip文件包含两个其他文件,我希望保持其他文件不变,但随后删除zip文件。我最初的尝试是将
解压和rm
插入脚本并执行它,但它找不到任何zip文件,我怀疑这是由于文件名中的空格。我不知道为什么
它找不到任何zip文件,我不敢相信,你能粘贴命令行吗?请,如果你想获得更多的见解,请查看答案。例如,您可以将命令
rm$f
mv$f
添加到.sh文件中,或者添加任何其他命令,如果您愿意的话。我得到一个
find:path必须在表达式之前:/usr/bin/unzip
。啊!第二种选择非常有效<代码>-删除
,我怎么不知道耶!我当然忘了提到的一个主要标准是解压和删除应该背靠背进行,因为驱动器不够大,无法解压所有内容,然后返回删除。非常感谢你!警告:当zip文件中有其他zip文件时,第三个选项不起作用。-1警告此命令将把所有zip提取到您的工作目录中。最好将拉链留在找到它们的路径中。请注意,如果您有多个
(i)name
子句,则必须将它们括在括号中:
find\(-iname”*.zip“-o-iname”*.7z”\)-execdir 7z x{}\-删除
您可以添加一条附加注释,即如果您有多个
(i)name
子句,则必须将这些子句括在括号中:
find\(-iname”*.zip“-o-iname”*.7z”\)-execdir 7z x{}-删除
。还要注意的是,
iname
可能更好,因为它也匹配
.ZIP
for F in $(find . -depth -name *.zip); do unzip "$F" -d "${F%.*}/" && rm "$F"; done
    unzip '*.zip'
    find . | sed 's/$/\.zip/g' | xargs -n 1 rm