我将一些东西解压到一个已经包含很多东西的目录中。我想解压到一个单独的目录中。现在有太多文件无法区分。但是,我解压的文件刚刚创建(对吗?),并且原始文件很久没有修改(至少一天)。有没有办法根据它们的创建信息删除这些未解压缩的文件?
问问题
2736 次
4 回答
7
Tar 通常会恢复文件时间戳,因此按时间过滤不太可能起作用。
如果你还有 tar 文件,你可以用它来删除你解压的东西,比如:
tar tf file.tar --quoting-style=shell-always |xargs rm -i
上面的方法在大多数情况下都有效,但不是所有的(有回车的文件名会破坏它),所以要小心。
您可以通过添加-r
来删除目录,但手动删除顶级目录可能更安全。
于 2011-10-01T10:26:12.717 回答
3
寻找 。-mtime -1 -类型 f | xargs rm
但首先测试
寻找 。-mtime -1 -类型 f | xargs 回声
于 2011-10-01T10:26:54.353 回答
1
这个问题有几个不同的答案,按照复杂性的顺序排列。
首先,如果这是一次性的,并且在此特定情况下,您绝对可以确定文件名中没有奇怪的字符(空格可以,但不能使用制表符、换行符或其他控制字符,也不能使用 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
于 2011-10-01T11:02:31.330 回答
0
您可以通过以下方式一次性处理文件和目录:
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
要处理带有换行符的文件名,您需要更多处理。
于 2014-05-04T18:32:18.403 回答