我把一些东西解放到一个已经包含很多东西的目录中。 我想解开一个单独的目录。 现在有太多的文件要区分。 然而,我已经解开的文件已经被创build(正确?)和原始文件没有被修改很长时间(至less一天)。 有没有办法根据他们的创build信息删除这些untarred文件?
Tar通常会恢复文件时间戳,因此按时间过滤不太可能奏效。
如果你仍然有tar文件,你可以用它来删除你打开的东西,如:
tar tf file.tar --quoting-style=shell-always |xargs rm -i
以上将在大多数情况下工作,但不是全部(文件名中有回车符将打破它),所以要小心。
您可以通过添加-r
来删除目录,但是手动删除顶层目录可能更安全。
找 。 -mtime -1 -type f | xargs rm
但是先测试一下
找 。 -mtime -1 -type f | xargs回声
这个问题有几个不同的答案,以增加复杂性。
首先,如果这是一个关闭,在这个特定的情况下,你绝对确信你的文件名中没有奇怪的字符(空格是好的,但不是标签,换行符或其他控制字符,也不是Unicode字符),这将工作:
tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | egrep -v '^\./$' | tr '\n' '\0' | xargs -0 rm -r
所有的egrepping是跳过子目录的所有子目录。
另一种方式来做到这一点与时髦的文件名工作是这样的:
mkdir foodir cd foodir tar -xf ../file.tar for file in *; do rm -rf ../"$file"; done
这将创建一个目录,其中您的档案已经扩大,但它听起来像你想要的,无论如何。 它也不会处理任何名字的文件.
。
使该方法适用于以文件开头的文件.
, 做这个:
mkdir foodir cd foodir tar -xf ../file.tar find . -mindepth 1 -maxdepth 1 -print0 | xargs -0 sh -c 'for file in "$@"; do rm -rf ../"$file"; done' junk
最后,从Mat的答案中 ,你可以做到这一点,它将适用于任何文件名,而不需要你再次解压目录:
tar -tf file.tar | egrep '^(\./)?[^/]+(/)?$' | grep -v '^\./$' | tr '\n' '\0' | xargs -0 bash -c 'for fname in "$@"; do fname="$(echo -ne "$fname")"; echo -n "$fname"; echo -ne "\0"; done' junk | xargs -0 rm -r
您可以通过以下方式一次处理文件和目录:
tar -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort | bash
你可以看到将要发生什么事情离开管道'bash'
tar -tf ../test/bob.tar --quoting-style=shell-always | sed -e "s/^\(.*\/\)'$/rmdir \1'/; t; s/^\(.*\)$/rm \1/;" | sort
用换行符处理文件名需要更多的处理。