对我来说,典型的错误是在错误的目录中进行提取。
意识到这一点后,我想删除所有文件,然后再次提取。
但是如何自动完成删除所有垃圾的操作呢?
有什么建议么?
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
如果你的档案中存在绝对路径,并且你确实不是使用-P
tar 选项解压(它将解压到绝对位置而不是当前或给定的目录),您需要从文件列表中删除前导斜杠,因为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
因为它也可能会删除存档中不存在的文件和目录。