撤消tar文件提取混乱

Mik*_*e T 36 linux bash undo tar

我刚刚解压了一个档案,该档案在我的整洁目录中产生了一堆文件。例如:

user@comp:~/tidy$ tar xvf myarchive.tar
file1
file2
dir1/
dir1/file1
dir1/subdir1/
dir1/subdir1/file1
dir2/
dir2/file1
...
Run Code Online (Sandbox Code Playgroud)

我原以为 tar 文件会被组织在一个文件夹中(即myarchive/),但事实并非如此!现在我有大约 190 个文件和目录,它们在一个有组织的目录中进行了数字化。这些解压缩的文件需要清理。

有什么方法可以“撤消”并删除从此存档中提取的文件和目录?


感谢下面的精彩回答。总之,这里有两个步骤(1)删除文件,(2)以反向打包顺序删除空目录结构(首先删除外部目录):

tar tf myarchive.tar | xargs -d'\n' rm
tar tf myarchive.tar | tac | xargs -d'\n' rmdir
Run Code Online (Sandbox Code Playgroud)

更安全的是,通过echoxargs.

Dan*_*son 41

tar tf archive.tar
Run Code Online (Sandbox Code Playgroud)

将逐行列出内容。

这可以xargs直接通过管道传输,但要注意:非常小心地进行删除。你希望只是rm -r一切都tar tf告诉你,因为它可能包括了未开箱之前空目录!

你可以做

tar tf archive.tar | xargs -d'\n' rm -v
tar tf archive.tar | sort -r | xargs -d'\n' rmdir -v
Run Code Online (Sandbox Code Playgroud)

首先删除存档中的所有文件,然后删除留空的目录。

sort -r(glennjackman 建议tac而不是sort -r在已接受答案的评论中,这也有效,因为tar的输出足够规则)首先需要删除最深的目录;否则,dir1包含单个空目录的情况dir2dir1rmdir传递后离开,因为它在被删除之前不是空的dir2

这会产生很多

rm: cannot remove `dir/': Is a directory
Run Code Online (Sandbox Code Playgroud)

rmdir: failed to remove `dir/': Directory not empty
rmdir: failed to remove `file': Not a directory
Run Code Online (Sandbox Code Playgroud)

2>/dev/null如果它惹恼你,请闭嘴,但我更愿意保留尽可能多的过程信息。

并且在您确定匹配正确的文件之前不要这样做。也许尝试rm -i确认一切。并有备份,吃早餐,刷牙等。


slh*_*hck 13

像这样列出 tar 文件的内容:

tar tzf myarchive.tar
Run Code Online (Sandbox Code Playgroud)

然后,通过遍历该列表来删除这些文件名:

while IFS= read -r file; do echo "$file"; done < <(tar tzf myarchive.tar.gz)
Run Code Online (Sandbox Code Playgroud)

这仍然只会列出将被删除的文件。更换echorm,如果你真的肯定这是要删除的人。也许做一个备份以确保。

在第二遍中,删除剩余的目录:

while IFS= read -r file; do rmdir "$file"; done < <(tar tzf myarchive.tar.gz)
Run Code Online (Sandbox Code Playgroud)

这可以防止目录被删除,如果它们之前已经存在。


@glennjackman 的另一个不错的技巧,它保留了文件的顺序,从最深的开始。再次,echo完成后删除。

tar tvf myarchive.tar | tac | xargs -d'\n' echo rm
Run Code Online (Sandbox Code Playgroud)

然后可以进行正常的rmdir清理。

  • 如果你想以相反的顺序删除:`tar tvf arch.tar | tac | xargs echo rm`(当你有信心时移除回声) (4认同)