我将一个 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 产生错误消息,但这应该不会产生影响(除非您遇到具有相同名称的文件的不太可能的情况)。
请注意,这不会删除在原始解压缩期间创建的任何目录。