如何“解压”一个 zip 文件?

maf*_*afp 52 linux zip bash

我将一个 zip 文件解压缩到一个非空文件夹中。zip 文件有很多文件和很深的层次结构,与目标目录的现有树合并。如何在不破坏已经存在的文件和目录的情况下删除通过解压缩创建的文件和目录?当然,我还有合并后的 zip 文件,所以信息就在那里。

jjl*_*lin 28

您可以使用unzip -lqq <filename.zip>来列出 zip 文件的内容;不过,这将包括一些您需要过滤掉的无关信息。这是一个对我有用的命令:

unzip -lqq file.zip | awk '{print $4;}' | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

awk命令仅提取文件和目录的名称。然后将结果传递给以xargs删除所有内容。我建议先执行命令的试运行(即,通过省略xargs rm -rf部分)以确保结果正确。

上面的命令在处理具有空格的路径时会出现问题。这个(更复杂的)版本应该解决这个问题:

unzip -lqq file.zip | awk '{$1=$2=$3=""; sub(/ */, "", $0); printf "%s%s", $0, "\0"}' | xargs -0 rm -rf
Run Code Online (Sandbox Code Playgroud)


ter*_*don 28

jjlin的答案是要走的路。我只想为目录添加一些选择:

  • 删除所有提取的文件,没有目录

    unzip -lqq file.zip | gawk -F"  " '{print $NF;}' |
      while IFS= read -r n; do rm "$n"; done
    
    Run Code Online (Sandbox Code Playgroud)
  • 仅删除提取的文件和目录

    unzip -lqq file.zip | gawk -F"  " '{print $NF;}' |
      while IFS= read -r n; do rm "$n"; done; rmdir *
    
    Run Code Online (Sandbox Code Playgroud)

    没有选项,rmdir只删除空目录,它将单独保留文件和非空文件夹,以便您可以安全地在*.

  • 删除提取的所有内容,但在每次删除前提示确认:

    unzip -lqq file.zip | gawk -F"  " '{print $NF;}' |
      while IFS= read -r n; do rm -ri "$n"; done; rmdir *
    
    Run Code Online (Sandbox Code Playgroud)

    -i标志会rm在每次删除前提示,您可以选择是或否。

  • 删除提取的所有内容,包括目录:

    unzip -lqq file.zip | gawk -F"  " '{print $NF;}' |
      while IFS= read -r n; do rm -rf "$n"; done
    
    Run Code Online (Sandbox Code Playgroud)


Den*_*nis 11

使用 switch -Z1, unzip 将每行只列出一个文件(没有别的)。

这样,您可以使用

unzip -Z1 | xargs -I {} rm '{}'
Run Code Online (Sandbox Code Playgroud)

删除从 zip 文件中提取的所有文件。

命令

unzip -Z1 | xargs -I {} rm -rf '{}'
Run Code Online (Sandbox Code Playgroud)

也会删除目录,但你必须小心。如果在解压缩 zip 文件之前这些目录已经存在,则这些目录中的所有预先存在的文件也将被删除。


如果您无论如何要重新提取 zip 文件,还有另一种方法可以保证处理奇怪的文件名。

首先解压缩您最初打算解压缩的 zip 文件:

unzip file.zip -d elsewhere
Run Code Online (Sandbox Code Playgroud)

现在,切换到您错误提取文件的目录并执行以下命令:

find elsewhere -type f -printf "%P\0" | xargs -0 -I {} rm '{}'
Run Code Online (Sandbox Code Playgroud)
  • -type f 只查找文件(没有目录)。

  • %P\0是相对路径(不带elsewhere/),后跟一个空字符。

  • -0使 xargs 由空字符分隔行。这更可靠,因为——理论上——文件名可以包含换行符。


要处理剩余目录,您可以执行以下命令:

find -type d -exec rmdir -p {} \; 2> /dev/null
Run Code Online (Sandbox Code Playgroud)
  • -type d 只找到目录。

  • -exec rmdir -p {} \;rmdir -p {}对找到的每个目录执行。

    {}是已找到的目录,-p开关使 rmdir 也删除其空父目录。

  • 2> /dev/null 抑制因尝试删除非空或以前删除的目录而产生的错误消息。


相关手册页: