如何“取消提取” zip 文件?

如何“取消提取” zip 文件?

我将一个 zip 文件解压到一个非空文件夹中。该 zip 文件包含大量文件和深层层次结构,与目标目录的现有树合并。如何删除解压时创建的文件和目录,而不破坏已存在的文件和目录?当然,我仍然有合并的 zip 文件,因此信息就在那里。

答案1

林建军的答案是正确的。我只想添加一些目录选项:

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

    unzip -lqq file.zip | gawk -F"  " '{print $NF;}' |
      while IFS= read -r n; do rm "$n"; done
    
  • 删除提取的文件并空的仅限目录

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

    没有选项时,rmdir仅删除空目录,它将保留文件和非空文件夹,以便您可以安全地运行它*

  • 删除一切已提取,但每次删除前都会提示确认:

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

    -i每次删除之前都会出现此标志rm的提示,您可以选择“是”或“否”。

  • 删除一切已提取,包含目录:

    unzip -lqq file.zip | gawk -F"  " '{print $NF;}' |
      while IFS= read -r n; do rm -rf "$n"; done
    

答案2

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

unzip -lqq file.zip | awk '{print $4;}' | xargs rm -rf

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

上述命令在处理包含空格的路径时会出现问题。此(更复杂)版本应该可以修复此问题:

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

答案3

使用开关-Z1,unzip 将在每行列出一个文件(而不列出其他任何文件)。

这样,您就可以使用

unzip -Z1 | xargs -I {} rm '{}'

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

命令

unzip -Z1 | xargs -I {} rm -rf '{}'

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


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

首先将 zip 文件解压到您最初想要解压的位置:

unzip file.zip -d elsewhere

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

find elsewhere -type f -printf "%P\0" | xargs -0 -I {} rm '{}'
  • -type f仅查找文件(无目录)。

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

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


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

find -type d -exec rmdir -p {} \; 2> /dev/null
  • -type d仅查找目录。

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

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

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


相关手册页:

答案4

这是一个更简单、更安全(我认为)的解决方案

zip -m getmeoutofhere.zip `unzip -lqq myoriginalzipfile.zip`
rm getmeoutofhere.zip

它的作用是:反引号中的 unzip 命令将生成原始文件内容的列表。

zip -m 然后会使用该列表将每个文件添加到 getmeoutofhere.zip并将其从原始目录中删除(因此理论上它应该与 myoriginalfile.zip 相同。

缺点是解压缩-lqq将产生一些额外的文本、日期、时间、文件大小等。这些将导致 zip -m 产生错误消息,但这应该不会产生影响(除非您遇到具有相同名称的文件的不太可能的情况)。

请注意,这不会删除在原始解压缩期间创建的任何目录。

相关内容