如何删除 tar.gz 存档文件夹中的所有文件

如何删除 tar.gz 存档文件夹中的所有文件

对我来说,典型的错误是在错误的目录中进行提取。

意识到这一点后,我想删除所有文件,然后再次提取。

但是如何自动完成删除所有垃圾的操作呢?

有什么建议么?

UPD:Linux 机器(zsh)

答案1

这应该可以解决问题:

tar -tzf archive.tar.gz | sed 's@^//*@@' | sort -r | xargs -d '\n' rm -d

如果您的档案包含绝对路径,并且您将其解压到绝对位置(为此您需要使用选项-P),tar则必须省略。如果您绝对确定档案中没有绝对路径,sed也可以省略。sed

tar -tzf archive.tar.gz | sort -r | xargs -d '\n' rm -d

解释

您可以使用以下选项获取 tar.gz 存档中的文件列表-t

tar -tzf archive.tar.gz

如果你的档案中存在绝对路径,并且你确实不是使用-Ptar 选项解压(它将解压到绝对位置而不是当前或给定的目录),您需要从文件列表中删除前导斜杠,因为tar -tf将始终显示它们。sed可以帮助:

tar -tzf archive.tar.gz | sed 's@^//*@@'

采用第一个和第二个之间的模式@- ^//*,与行首的一个或多个匹配/- 并将其替换为第二个和第三个之间的字符串@- 在本例中为空,从而有效地删除匹配项。

xargs可以将一个命令的输出作为另一个命令的参数:

tar -tzf archive.tar.gz | sed 's@^//*@@' | xargs -d '\n' rm

这将获取由换行符 ( ) 分隔的文件列表,-d '\n'并将其传递给rm。这将删除任何文件。与往常一样,目录不会被删除,并且您将收到每个目录的错误消息。

为了获得之前解压​​创建的任何目录,你需要使用rm -d,这也将删除空的目录。 的输出tar -t通常按字母顺序排列,这意味着任何目录都将列在其中的文件之前。这意味着当rm尝试删除目录时,目录尚未清空。为了避免这个问题,我们只需sort -r按字母顺序重新排列列表即可。这样,在rm尝试删除目录本身之前,目录中的任何文件都将先被删除。

tar -tzf archive.tar.gz | sed 's@^//*@@' sort -r | xargs -d '\n' rm -d

包含存档中不存在的文件的目录(例如,如果目录在解压前已经存在且包含文件)将不会被删除。请不要使用rm -r而不是 ,rm -d因为它也可能会删除存档中不存在的文件和目录。

相关内容