问题描述
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-
不带参数的
find
会递归列出当前目录下的所有文件/目录。您应该尝试查找man find
以了解如何使其具有选择性(宝库),但如果您不想麻烦,您可以使用熟悉的grep
来筛选要删除的文件。 -
假设我是 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。