Linuxrecursion删除保留第一个目录

第一个问题在这里,我通常在StackOverflow。

我需要删除一个目录的所有内容,但不是目录本身,因为我没有删除该实际目录的权限。 这似乎很简单,但我无法find这个命令。 提前致谢。

rm -r /path/to/directory/* 

要么

 rm -rv /path/to/directory/* 

如果你想看看发生了什么。

混沌 – 你不正确的关系,将永远删除..

我做了一个快速search,find了第7版unix手册中的手册页http://plan9.bell-labs.com/7thEdMan/vol1/man1.bun ,它说:

诊断

  Generally self-explanatory. It is forbidden to remove the file .. merely to avoid the antisocial consequences of inadvertently doing something like rm -r . 

鉴于第七版unix是所有现代unix的母公司,并于1979年发布,我会说这是一个强调安全的事情要做。 它什么都不做,但是不会造成任何伤害。

现在,还有其他一些像chown这样的程序,如果你喜欢“chown -Rh user。*”这样古怪的东西,但是rm不是chown,那么它将会高兴地“下降”到各种各样的混乱中。

易于使用的版本,如果当前目录可以正常工作:

 find . ! \( -name . \) -print0 | xargs -0 rm -rf 

如果当前目录不好,更难的版本:

 find /some/dir ! \( -samefile /some/dir \) -print0 | xargs -0 rm -rf 

find / path / dir / -type f -print | xargs rm

为什么不只是:

 rm -rf directory 

您将收到错误消息,因为您没有删除目录的权限。 但它也将删除目录中的所有内容,包括那些麻烦的隐藏文件。

这是unix可以快速粘贴的黑暗领域之一。

上面的每一个例子都让人联想到unix中一个长期存在的bug,现在人们只是把它看作一个可爱的小个性怪癖。

找 。 | xargs rm

如果目录中有不正确的文件名(如换行符或空格),将不起作用。 如果有一个文件名,你甚至可以开始删除不在目录中的其他文件; 在里面。 谁知道如果有一个文件名“在里面会发生什么。 只要问一下博比的桌子。 事情可以很快激发起来。

比尔·魏斯的评论正确地指出,find和xargs的现代版本,正确地使用nulls作为字段分隔符,find每个东西,如果您在find中使用-print0,在xargs中使用-0。 不是一种信任的types,并且随着unix的破旧版本的削减,我倾向于对这些新奇的gnuisms保持警惕,即使它们工作的很好,在这种情况下,这个问题是正确的答案。

如果在该目录中有10,000个文件,rm -r / path / to / directory / *将不起作用。

现在 – 大多数情况下,我只是不打算这样做,所以我会使用rm -rf,并查看错误是否有错误。 如果我100%肯定有没有古怪的文件,我可能会使用find和xargs,但我并不真正相信这些。

如果我正在使用一个自动运行的脚本来执行这个操作,而且我不知道要使用这个脚本多长时间,或者谁将要使用它,我会试着以正确的方式进行操作。

我真的不能想到一个快速,整洁和可靠的方法来做到这一点,但我想我可以用一个bourne shell脚本来做到这一点:

 for a in * .* do rm -rf "$a" done 

现在 – 这是安全的,因为for循环保护“rm”的命令行不受十亿次input的影响,并且variables周围的双引号使它免受诸如转义字符或分号或其他元垃圾之类的古怪事情的影响。 它也比find + xargs慢得多。

所以我想正确的答案是“没有这样的程序,你必须编写一个程序来做到这一点。 我想这是什么摊贩和所有用find和xargs做的…

我相信可以使用:rm -rf / test / *

你可以试试

# rm -rf [dir]/* [dir]/.*