Linux 如何删除Bash中的所有文件和子目录,包括边缘案例

Linux 如何删除Bash中的所有文件和子目录,包括边缘案例,linux,bash,Linux,Bash,我想删除Bash中给定目录中的所有文件和子目录,我是该目录(可写)及其下所有内容的所有者。我没有根访问权限。我希望得到一个至少记住以下情况的答案: mkdir foo touch foo/bar chmod 555 foo 以及任何其他边缘情况。我目前的解决办法是 chmod -R 777 * &> /dev/null # ignore error when pwd is already empty rm -rf * 是否还有其他我没有想到的边缘案例,我将如何处理它们?有

我想删除Bash中给定目录中的所有文件和子目录,我是该目录(可写)及其下所有内容的所有者。我没有根访问权限。我希望得到一个至少记住以下情况的答案:

mkdir foo
touch foo/bar
chmod 555 foo
以及任何其他边缘情况。我目前的解决办法是

chmod -R 777 * &> /dev/null    # ignore error when pwd is already empty
rm -rf *

是否还有其他我没有想到的边缘案例,我将如何处理它们?有更可靠或更简单的答案吗?

我看到的主要情况是当前目录中是否有很多名称。这可能会导致
*
扩展到如此多的名称,从而超过命令行的最大长度。为了避免这种情况,只需使用
而不是
*
;这也将捕获隐藏的文件(那些以
开头的文件)。

使用
find
我通常感觉更舒服。不幸的是,在您的示例中,您将忽略两个过程。(或者,至少,我无法编写一个pass命令。)

这将优雅地处理空目录和隐藏文件

请注意,我只将权限位设置为0700(而不是0777)。这足以删除文件,并且不会打开(那么多)安全漏洞。如果你担心的话,你实际上应该这样做

find . '(' -type d -execdir chmod 0700 '{}' ';' ')' -or -execdir chmod 0600 '{}' ';'
仅设置目录上的可执行位

然而,如果同时修改目录树,那么这种方法将无法免疫竞争条件


请注意,
-execdir
是GNU扩展。如果您需要严格遵守POSIX,您需要使用不太安全的
-exec

您不应该忽略
chmod
的错误,还有哪些错误(我拥有一切)?Bash确实提供了对异常处理的良好控制。为什么需要chmod?您尝试过我提供的场景吗?您得到
rm:cannotremove'foo/bar':权限被拒绝
Good point,但我得到
rm:cannotremove directory:'。
当我尝试
rm-rf时。
find . '(' -type d -execdir chmod 0700 '{}' ';' ')' -or -execdir chmod 0600 '{}' ';'