我想从Bash中的给定目录中删除所有文件和子目录,其中我是目录的所有者(可写)以及下面的所有内容。我没有root访问权限。我想要一个至少记住以下场景的答案:
mkdir foo
touch foo/bar
chmod 555 foo
以及任何其他边缘情况。我目前的解决方案是
chmod -R 777 * &> /dev/null # ignore error when pwd is already empty
rm -rf *
是否有其他边缘情况我没有想过,我将如何处理它们?是否有更强大或更简单的答案?
答案 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)
我看到的主要边缘情况是当前目录中是否有很多名称。这可能会导致*
扩展到如此多的名称,使其超出命令行的最大长度。为避免这种情况,只需使用.
代替*
;这也将捕获隐藏文件(以.
开头的那些文件)。