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


17

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

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

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

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

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


4
好吧,至少我有一个备份策略……并没有真正的伤害。
GUI Junkie 2012年

2
很高兴知道; 我有一个从不使用的政策,-r除非我想摆脱一切。
ish 2012年

3
附带说明一下,rm -r *~ .将删除所有与*~或匹配的文件和文件夹(在当前目录中).。(由于特殊情况,.将被忽略rm,因为大多数人不希望递归删除当前目录。*~删除当前目录中以结尾的所有文件和目录~,而不是当前目录的子目录中的文件和目录。 )所以这不是您想要的。您可能希望find与该-exec标志一起使用,以递归方式浏览目录树,并以非递归方式删除以结尾的每个文件~
Eliah Kagan 2012年

@EliahKagan,我猜是这样,但是使用-exec查找总是很麻烦。不过,恢复主目录更加麻烦:-)
GUI Junkie 2012年

1
信息性:在~不转义的情况下唱字符(例如\~:)会使Bash,ZSH等(rm基本上是命令)认为您的意思是主目录。
托马斯·沃德

Answers:


31

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

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

如果您没有添加-f(如中的rm -rf something),则会得到以下内容:

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

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

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

注意:社区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
  • 如果要从当前目录中删除,请在./前面加上a ,以免误删除其他位置:

    $ 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


1
管道find输出到grepxargs rm有危险。
geirha 2012年

2
@izx:添加了mv(我最喜欢的命令);)
Takkat 2012年

1
我至少要添加一个使用find安全方法的示例,如果文件名包含空格,制表符,换行符"'字符,则该方法不会中断(并可能删除错误的文件)。例如find . -name "*example*" -exec rm -v {} +mywiki.wooledge.org/UsingFind
geirha

1
@geirha:为什么find -delete这么危险?我会在这里说些什么,但是除了最近找到的我不知道,并且/尽管没有选择地进行了试运行,但还是擦掉了我,-delete只发现了一些我想要删除的文件。我看到您推荐了-exec rm
塔卡特2012年

3
@Takkat -delete并不危险,您可以放心使用它而不是-exec rm {} +。我通常会尽可能使用标准工具和功能。-delete是对GNU的非标准GNU扩展find,因此它可以在Ubuntu上正常工作,但在其他系统上可能无法正常工作。
盖尔哈

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.