我将某些内容解压缩到已经包含很多内容的目录中。我想改为进入一个单独的目录。现在有太多的文件无法区分。但是我刚刚创建的文件是刚刚创建的(对吗?)并且原始文件没有被修改很长时间(至少一天)。有没有办法根据创建信息删除这些未解压缩的文件?
答案 0 :(得分:6)
Tar通常会恢复文件时间戳,因此按时间过滤不太可能。
如果您还有tar文件,可以使用它来删除解压缩的内容,例如:
tar tf file.tar --quoting-style=shell-always |xargs rm -i
以上内容适用于大多数情况,但不是全部(在其中包含回车符的文件名会破坏它),所以要小心。
您可以通过添加-r
来删除目录,但是手动删除顶层目录可能更安全。
答案 1 :(得分:3)
但先用
进行测试 找到。 -mtime -1 -type f | xargs echo答案 2 :(得分: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's answer开始,您可以执行此操作,它可以用于任何文件名,而不需要您再次解压缩该目录:
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
答案 3 :(得分: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
使用换行处理文件名需要更多处理。