'rm -r ~' 对我的主目录做了什么?

GUI*_*kie 18 command-line bash

gedit 创建以“~”结尾的隐藏备份文件。我想对我的目录树进行递归清理。

该命令rm *~将删除所有以“~”结尾的本地文件

我以为rm -r *~ .会删除整个树中的所有文件,但我打错了rm -r ~.

有一条消息无法删除某个目录,我退出了该命令。问题是:我删除了什么?

我确实注意到我的 Filezilla 配置不见了。此命令是否从主目录中删除所有隐藏目录?

ish*_*ish 31

您已删除(几乎)所有主目录!

rm -r something 递归删除某物内/下的文件和目录;它只会在它无权删除的项目上失败,因为它们由不同的用户拥有(例如root),或者因为它们正在使用中(例如 GVFS 安装)。

如果你没有添加-f(如,rm -rf something),你会得到类似的东西:

rm: remove write-protected regular file ‘something’?
rm: descend into write-protected directory ‘something’?
Run Code Online (Sandbox Code Playgroud)

此时您可以中止,然后您可能会意识到您执行了错误的命令。

社区对如何避免此类事故的建议

注:社区wiki,请大家踊跃投稿。

  • 对于一些文件,使用该-i选项来确认删除文件或目录:

    $ rm -ri something/
    rm: remove regular file ‘something/file~’? y
    rm: descend into directory ‘something’? y
    rm: remove regular file ‘something/file’? y
    rm: remove directory ‘something’? y
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果从当前目录中删除,请在它./前面加上前缀,以避免错误地删除不同的位置。:

    $ cd something
    $ rm -v ./*~
    removed ‘./file~’
    
    Run Code Online (Sandbox Code Playgroud)

    以上是为了演示./. 如果有子目录,当然也可以使用rm -v something/*~当心:不要认为rm ./.*删除当前目录中的所有隐藏文件。有关隐藏文件通配的变通方法,请参阅此 Serverfault 问题

  • 移动而不是删除:在我最终删除文件之前,我习惯于想要删除的文件移动到其他地方,而不是首先递归删除文件。如果出现问题,很容易恢复。

    mv -b SOURCE DEST
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果要递归删除选定的文件,请使用find(可能与grep)进行预览 您应该尽量减少这种情况的发生,但如果您必须...

    1. find不带参数递归列出当前文件/目录下的所有文件/目录。您应该尝试查找man find如何使其具有选择性(一个宝库),但如果您不想打扰,您可以使用熟悉grep的过滤器来过滤要删除的文件。
    2. 假设我是一个 uber-l33t 内核黑客,并且被我的源​​代码树中的几个 KB 的“示例”文件所困扰;我想删除名称中包含该名称的所有文件。所以我输入find | grep example,这给了我这 20 个文件。 看起来不错,所以我现在去删除那些确切的文件,以及rm -v前面提到的详细输出,通过xargs
      查找 | grep 示例 | xargs rm -v
      这给了我这个输出。 这样的预览可以防止出现问题,比如您打错字并键入sample而不是example.

上述解决方案不应该被使用,如果你可能有包含空格,制表符,换行符或引号的文件名("'),因为这将导致xargs要么失败,或饲料rm用不完整的文件名,这在最坏的情况下可能最终消除了错误文件。执行上述操作的安全方法是使用find的运算符和操作来完成所有操作。

以下将显示所有包含该词的文件 example

find . -name "*example*"  
Run Code Online (Sandbox Code Playgroud)

如果该列表是您要删除的文件,请使用该-exec操作将文件传递到rm.

find . -name "*example*" -exec rm -v {} +
Run Code Online (Sandbox Code Playgroud)

请参阅使用查找与使用更多的帮助find

  • @Takkat `-delete` 并不危险,您可以安全地使用它代替 `-exec rm {} +`。如果可能,我通常更喜欢使用标准工具和功能。`-delete` 是 `find` 的非标准 GNU 扩展,因此它可以在 Ubuntu 上正常工作,但在其他系统上可能不会。 (3认同)
  • @izx:添加了`mv`(我最喜欢的命令);) (2认同)

gei*_*rha 5

是的。未加引号的波浪号字符作为单独的参数被扩展到您的 homedir。所以rm -r ~扩展为rm -r /home/yourusename. 所以你告诉 rm 递归删除 homedir 中的所有文件。

有关波浪号扩展如何工作的更多信息,请参阅http://www.gnu.org/software/bash/manual/bashref.html#Tilde-Expansion