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

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

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

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

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

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

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

答案1

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

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

如果你没有添加-f(例如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,它给了我这 20 个文件。 看起来不错,所以我现在去删除这些精确的文件,以及rm -v前面提到的详细输出,通过xargs
      查找 | grep 示例 | xargs rm -v
      这让我这个输出。sample这样的预览可以避免出现问题,比如 ,您输入错误并输入了example

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

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

find . -name "*example*"  

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

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

使用查找以获得有关使用 的更多帮助find

答案2

是的。不带引号的波浪号作为单独的参数扩展到您的主目录。因此rm -r ~扩展到rm -r /home/yourusename。因此您告诉 rm 递归删除主目录中的所有文件。

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

相关内容