当前位置: 首页>>技术教程>>正文


“rm -r ~” 对我的主目录有什么作用?

,

问题描述

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

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

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

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

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

最佳方案

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

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

如果您没有添加 -f (如 rm -rf something ),您将得到类似以下内容:

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

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

社区就如何避免此类事故提出的建议

\\n

Note: Community wiki, everyone please feel free to contribute.

\\n

  • 对于一些文件,使用 -i 选项来获取有关删除文件或目录的确认:

    \n

    $ rm -ri something/\nrm: remove regular file \u2018something/file~\u2019? y\nrm: descend into directory \u2018something\u2019? y\nrm: remove regular file \u2018something/file\u2019? y\nrm: remove directory \u2018something\u2019? y\n
  • 如果从当前目录删除,请在其前面加上 ./,以避免错误地删除其他位置。:

    \n

    $ cd something\n$ rm -v ./*~\nremoved \u2018./file~\u2019\n

    \n

    以上内容用于演示 ./ 的使用。如果有子目录,当然也可以使用 rm -v something/*~。注意:不要认为 rm ./.* 会删除当前目录中的所有隐藏文件。请参阅 this Serverfault question 以了解隐藏文件通配符的解决方法。

  • 移动而不是删除:我习惯先将要删除的文件移动到其他地方,然后再删除,而不是一开始就递归地删除文件。如果出现问题,很容易恢复。

    \n

    mv -b SOURCE DEST\n
  • 如果您想递归删除选定的文件,请使用 find(可能与 grep 一起使用)进行预览。您应该尝试让这种情况很少发生,但如果必须这样做…\n

    1. 不带参数的 find 会递归列出当前目录下的所有文件/目录。您应该尝试查找 man find 以了解如何使其具有选择性(宝库),但如果您不想麻烦,您可以使用熟悉的 grep 来筛选要删除的文件。

    2. 假设我是 uber-l33t 内核黑客,并且被源代码树中几 KB 的 “example” 文件所困扰;我想删除名称中包含该文件的所有文件。因此我输入 find | grep example ,结果给出了 these 20 files. ,看起来不错,因此我现在去删除这些文件以及前面提到的 rm -v 详细输出,通过 xargs :\\n\\nfind | grep example | xargs rm -v\\n\\n这给了我 this output. ,这样的预览可以避免出现问题,比如你输入错误,将 example 写成了 sample

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

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

find . -name "*example*"  

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

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

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

次佳方案

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

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14513.html,未经允许,请勿转载。