在 unix 上清理当前目录 rm -r *

在 unix 上清理当前目录 rm -r *

这是清理当前目录的正确方法,对吗?

rm -r * .

答案1

我通常只是在层次结构中向上移动一个级别,然后按名称删除目录并重新创建它:

cd ..
rm -rf dirname
mkdir dirname
cd dirname

rm -rf *因为这样可以消除在错误目录中使用的错误情况。

笔记:如果目录具有非标准权限或归其他帐户所有,则当您删除并重新创建目录时,您将失去该权限。这种情况对我来说并不常见,但值得考虑。

如果我需要在脚本中执行此操作,我可能会创建一个函数来保存当前目录、向上移动一级、删除并创建新的空目录并移动到那里。

答案2

不是,原因有几个:1)该命令将尝试删除.,即当前目录,因此将失败;2)该命令不会删除以‘.’字符开头的“隐藏”文件;3)该命令不会删除目录。

您可以使用rm -rf *。这将删除所有文件和目录,但不会删除点文件。您可以使用find . -type f | xargs rm删除所有文件(包括隐藏文件),但这不会删除目录。

因此,你可以使用这个:

$ find . -print0 -type f -o -type d -not -name '\.' | xargs -0 rm -rf

在这里,您可以递归查找所有文件和目录(只要它们不叫“。”),然后删除它们。-print0-0参数允许它正确处理名称中带有空格的文件名。

答案3

如果 -mindepth 和 -delete 开关可用,您可以这样做:

find . -mindepth 1 -delete

如果你想坚持POSIX,你可以这样做(如上所示unix.com):

find . \( ! -name . -prune \) -exec rm -rf {} \+

答案4

如果您使用的是 bash(版本 4 或更高版本),则可以使用dotglobshell 选项在 glob 中包含以点开头的文件名。

shopt -s dotglob
rm -r -- *

上述操作将在包含数十万个文件的目录中失败;在这种情况下,您可以使用printf(作为 bash 内置命令,嘲笑 ARG_MAX)和xargs(将为提供安全数量的参数rm)。

shopt -s dotglob
printf '%q ' * | xargs rm -r --

dotglob完成后您可以取消设置:

shopt -u dotglob

另一种不弄乱 shell 选项的方法是:

rm -r -- * .[^.]* ..?*
##  or
printf '%q ' * .[^.]* ..?* | xargs rm -r --

第一个 glob*将匹配当前目录中不以点开头的所有内容;第二个 glob.[^.]*将匹配以点开头、后跟单个非点字符、后跟任意数量的其他字符的所有内容;第三个 glob 将匹配两个点、后跟任意一个字符、后跟任意数量的其他字符。如果您被困在没有 dotglob 选项的 shell 中,这可能会很有用;但是,在这种情况下printf可能不是 shell 内置的,或者可能缺少标志%q(它会引用输入给它的参数中的所有空格和不寻常的字符,使它们可以安全地传递给),因此在这种情况下xargs您应该使用基于 - 的解决方案之一。find

相关内容