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
)来预览如果您想递归删除选定的文件。 您应该尝试使这种情况很少发生,但如果必须这样做……find
不带参数的递归列出当前目录下的所有文件/目录。您应该尝试查找man find
如何使其具有选择性(宝库),但如果您不想麻烦,您可以使用熟悉的方法grep
来过滤要删除的文件。- 假设我是一名 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了解有关波浪号扩展如何工作的更多信息。