如何删除最近在linux目录中创build的所有文件?

我把一些东西解放到一个已经包含很多东西的目录中。 我想解开一个单独的目录。 现在有太多的文件要区分。 然而,我已经解开的文件已经被创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 

用换行符处理文件名需要更多的处理。