如何使用Bash删除所有隐藏的文件和目录?


28

显而易见的解决方案产生的退出代码为1:

bash$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
bash$ echo $?
1

一种可能的解决方案是跳过“。” 和“ ..”目录,但只会删除名称长度超过3个字符的文件:

bash$ rm -f .??*

好吧,如果您不太担心无法删除。&..那谁在乎呢?除非您担心脚本中的输出丑陋,否则我认为显而易见的解决方案是坦率地说其他类型的输入较少。
马特

请注意,..和。不是文件。它们是对目录的引用。。(仅一个点)是当前目录,而..(两个点)是指向上一级目录的链接。例如,如果是cd / home / user,则为。等于/ home / user和..等于/ home /换句话说,您不能删除。和..(。?)
phuzion

感谢您的评论,马特。我经常在脚本中使用该命令,并按命令退出代码进行检查(设置-e)。在这些情况下,必须提供指示性的退出代码。
Yonatan Broza 09年

没有内在的内在。和..可以防止它们被rm -rf删除。这只是rm的现代变体中增加的一种保护机制。
kubanczyk,2009年

总是有rm -rf。* || 如果只想绕过该语句的set -e行为,则为true。
Domingo Ignacio Galdos 2012年

Answers:


34
rm -rf。[^。]。?? *

应该抓住所有情况。。?? *仅匹配3个以上的字符文件名(如上一个答案中所述),。[^。]将捕获任何两个字符条目(..除外)。


感谢您的回答!基于此,我还得到了“ rm -rf。[^。] *”的缩写。
Yonatan Broza

4
请注意使用较短的版本,它会产生相似但不相同的结果。它不会将名称与前面带有两个点的名称匹配(例如,有时会隐藏Rootkit等的“ ... /”)
Russell Heilling 09年

并请小心进行PWD检查或您放松所有设置:)
kommradHomer 2013年

这似乎不起作用zsh。有什么建议么?
ryanjdillon '16

zsh缺省的空通配符匹配被视为错误; 而bash只是简单地将其传递不变。若要使zsh行为相同,您可以使用命令unsetopt nomatch
Russell Heilling

1
find -path './.*' -delete

这将匹配当前目录中以a开头的所有文件,并以.递归方式删除这些文件。未隐藏目录中的隐藏文件不受影响。

如果您真的想擦除目录中的所有内容find -delete就足够了。


这将删除所有内容,而不仅仅是删除以.
开头的

哦,看来我误解为“删除包括隐藏文件在内的所有内容”的问题。
Fritz

@kasperd谢谢,现在它实际上应该回答问题了。
Fritz

0

最好的方法可能是:

  • 找 。-iname。* -maxdepth 1 -type f -exec rm {} \;

如果您只想查看将要删除的内容,请将rm更改为ls -l,以详细说明输出,您可能希望向rm添加-v选项

  • -type f选项告诉find命令仅查找文件(忽略目录,链接等)
  • -maxdepth 1告诉发现不要进入子目录

ps。不要忘记以“ \;”结尾


1
小心!您的意思是-iname'。*'或-iname。*,否则您将拖入。和..无论如何。
Domingo Ignacio Galdos 2012年

-1
ls -la | awk '$NF ~ /^\.[^.]+/  {print $NF}' | xargs rm -rf

ls -la ............. long list (all files and folders)
$NF ................ last field (file or folder name)
~   ................ Regular Expression match
/^\.[^.]+/ ......... dot followed by not dot at least once +

If the last field $NF match pattern show it and send 
it to xargs which will perform the task.

这会中断您的文件名中包含空格的瞬间。
CVn
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.