这是清理当前目录的正确方法,对吗?
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
答案4
如果您使用的是 bash(版本 4 或更高版本),则可以使用dotglob
shell 选项在 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