如何删除当前目录中以点开头的所有文件?

Gre*_*ory 7 command-line shell wildcards dot-files

我使用 Ubuntu 14.04,并在终端中使用 sudo su 成为 root,我想手动删除 root 的垃圾箱。除了一些以点开头的文件外,它删除了所有内容。像 .htaccess 等。所以我去了那个目录(这是“文件”),我运行了这个命令:

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

它确实删除了这些文件,但我也收到一条错误消息,系统无法删除“。” 和“..”是什么意思?就像我试图删除整个目录树一样?就像我说的,当我运行该命令时,我位于最低目录中。准确地说是这个:/root/.local/share/Trash/files/ 我击落了我的电脑,然后打开了它。乍一看,一切似乎都很正常。所以现在我想问的是出了什么问题,我所做的是否真的会对系统造成任何严重损害?换句话说,我现在应该担心还是一切都好?

Joh*_*éen 6

当你想删除所有的点文件时,约定是使用这个命令:

rm .??*
Run Code Online (Sandbox Code Playgroud)

这将开始删除包含至少两个其他字符,从而留下一个点的所有文件...完整。当然,它也会遗漏点后只有一个字母的文件名,但这种情况应该很少见。


Gil*_*il' 5

.*匹配名称以..开头的所有文件。每个目录都包含一个.引用目录本身的文件,以及一个..引用父目录的文件。.*包括那些文件。

幸运的是,尝试删除...失败,因此您会得到一个无害的错误。

在 zsh 中,.*不匹配...。在 bash 中,您可以设置

GLOBIGNORE='.:..:*/.:*/..'
Run Code Online (Sandbox Code Playgroud)

然后*将匹配所有文件,包括点文件,但不包括...

或者,您可以使用明确排除.和的通配符模式..

rm -rf .[!.]* ..?*
Run Code Online (Sandbox Code Playgroud)

或者

rm -rf .[!.] .??*
Run Code Online (Sandbox Code Playgroud)

或者,使用find.

find . -mindepth 1 -delete
Run Code Online (Sandbox Code Playgroud)

  • @Gregory 目录是一种文件。`*` 省略了所有点文件而不仅仅是 `.` 和 `..` 的事实实际上源于一个编程错误(在 `ls` 中,`*` 通配符再现了其行为):作者的意思是跳过 ` .` 和 `..` 但代码最终跳过了所有名称以 `.` 开头的文件,他们事后做出了可疑的决定,认为这是一个有用的行为并保留了它。 (2认同)

dav*_*rey 5

find /path/to/dir -type f -name ".*" -delete
Run Code Online (Sandbox Code Playgroud)