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

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

命令rm *~将删除所有以’〜’结尾的本地文件

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

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

我注意到我的Filezilla配置已经消失了。 此命令是否从主目录中删除所有隐藏目录?

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

rm -r something 递归方式删除rm -r something文件和目录; 它只会在没有删除权限的项目上失败,因为它们由不同的用户(例如root )拥有,或者因为它们正在使用(例如GVFS挂载)。

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

 rm: remove write-protected regular file 'something'? rm: descend into write-protected directory 'something'? 

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

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

注意:社区维基,大家请随时贡献。

  • 对于一些文件,使用-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 
  • 如果从当前目录中删除,请以./作为前缀,以避免错误地删除其他位置:

     $ cd something $ rm -v ./*~ removed './file~' 

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

  • 移动而不是删除:而不是在第一个地方递归删除文件,我习惯移动文件,我想删除其他地方,最后删除它们。 如果出现问题,很容易恢复。

     mv -b SOURCE DEST 
  • 如果要递归删除所选文件,请使用find (可能带有grep )进行预览 你应该尝试使这种情况罕见,但如果你必须…

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

      这给了我这个输出。 这样的预览可以防止出现问题,例如,您输入拼写错误并输入sample而不是example

如果您的文件名可能包含空格,制表符,换行符或引号( "' ),则不应使用上述解决方案,因为这会导致xargs失败,或者使用不完整的文件名提供rm ,这在最坏的情况下可能会结束删除错误的文件。执行上述操作的安全方法是使用find的操作符和操作完成所有操作。

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

 find . -name "*example*" 

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

 find . -name "*example*" -exec rm -v {} + 

有关使用find的更多帮助,请参阅使用Find 。

是。 作为单独参数的不带引号的波浪号角色会扩展到您的homedir。 所以rm -r ~扩展到rm -r /home/yourusename 。 所以你告诉rm以递归方式删除homedir中的所有文件。

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