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

时间:2014-09-20 11:04:47

标签: linux bash

我想从Bash中的给定目录中删除所有文件和子目录,其中我是目录的所有者(可写)以及下面的所有内容。我没有root访问权限。我想要一个至少记住以下场景的答案:

mkdir foo
touch foo/bar
chmod 555 foo

以及任何其他边缘情况。我目前的解决方案是

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

是否有其他边缘情况我没有想过,我将如何处理它们?是否有更强大或更简单的答案?

2 个答案:

答案 0 :(得分:1)

使用find时,我感觉更舒服。不幸的是,在你的例子中你将获得两遍。 (或者,至少,我无法编写单遍命令。)

find . -execdir chmod 0700 '{}' ';'
find . -delete

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

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

find . '(' -type d -execdir chmod 0700 '{}' ';' ')' -or -execdir chmod 0600 '{}' ';'

仅设置目录上的可执行位。

无论如何,如果同时修改目录树,这种方法将不会受到竞争条件的影响。

请注意-execdir是GNU扩展。如果您需要严格的POSIX合规性,则需要使用安全性较低的-exec

答案 1 :(得分:0)

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