为什么我的命令:“rm -rf *”没有删除目录中的所有文件?

Job*_*r69 3 bash rm

大多数文件都消失了,但我仍然留下这两个文件:

“.RData”和“.Rhistory”

为什么会这样?我正在使用 R,但我不知道这些文件是什么。

之后,我可以单独删除它们而无需使用 sudo。

Joh*_*024 20

*只包括可见文件。如果您想同时删除那些和隐藏的,请使用:

rm -rf * .*
Run Code Online (Sandbox Code Playgroud)

dotglob 选项

使用 bash,我们可以更改此行为并取消隐藏文件。为了说明,让我们创建两个文件,一个隐藏,一个不隐藏:

$ touch unhidden .hide1
$ ls *
unhidden
Run Code Online (Sandbox Code Playgroud)

如您所见, 仅显示未隐藏的ls *。现在让我们设置dotglob选项:

$ shopt -s dotglob
$ ls *
.hide1  unhidden
Run Code Online (Sandbox Code Playgroud)

这两个文件现在都出现了。当然,如果我们愿意,我们可以关闭 dotglob:

$ shopt -u dotglob
$ ls *
unhidden
Run Code Online (Sandbox Code Playgroud)

文档

来自man bash

当模式用于路径名扩展时,字符“.” 除非设置了 shell 选项 dotglob,否则在名称的开头或紧跟在斜杠之后必须显式匹配。匹配路径名时,必须始终明确匹配斜杠字符。在其他情况下,“.”字符不被特殊对待。有关 nocaseglob、nullglob、failglob 和 dotglob shell 选项的说明,请参阅 SHELL BUILTIN COMMANDS 下的 shopt 说明。

换句话说,除非明确指定,否则路径名扩展会忽略名称以 开头的文件。..

安全问题

为避免令人不快的意外,即使您在命令行中指定它们,rm也会拒绝删除当前目录.和父目录..

$ rm -rf .*
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘.’
rm: refusing to remove ‘.’ or ‘..’ directory: skipping ‘..’
Run Code Online (Sandbox Code Playgroud)