如何在UNIX系统中递归删除目录中的所有隐藏文件?

29

我已经搜索了一段时间,但似乎找不到一个简洁的解决方案。我有一个Mac电脑上的文件夹,我想清除所有隐藏文件/目录 - 任何隐藏的内容。它曾经是Eclipse工作区,有很多.metadata/.svn等内容,我希望全部清除。我该如何做到这一点(使用shell脚本,Applescript等)。提前感谢!

6个回答

58

find . -name ".*" -print

这是在大多数* nix环境中查找它们所有隐藏文件的方法,其中“.”表示从当前目录开始。请注意,“.*”可以更改为“.svn *”或任何其他更具体的名称,以选择性地查找特定的隐藏文件。

find . -name ".*" -exec rm -rf {} \;

使用上述命令可以删除所有隐藏文件,请在删除之前先执行第一个查找命令,确保列表中包含您要删除的所有文件或目录。这个命令可能会搞砸你的系统,所以一定要小心!


9
将尝试删除当前目录(名称为“.”)。 - Dennis Williamson
2
find . -name ".*.*" -print 将会查找文件名中至少包含一个点的任何文件。 - sakabako
1
@jmq 我想你应该使用反斜杠而不是正斜杠:\; - l0b0
POSIX find 支持使用 + 代替 \;,这样可以使命令更加高效。 - l0b0
正如@DennisWilliamson在他的评论中提到的那样,这会作用于当前目录,如果你使用的是像svn rm而不是rm -rf这样的命令,那么就很糟糕了。最好按照Dennis建议的在下面加上-mindepth 1。 - Ian Cohen
显示剩余5条评论

18

你需要非常小心并测试任何你使用的命令,因为你可能不希望删除当前目录(.)、父级目录(..)或所有文件。

这应该仅包括以点开头的文件和目录,并排除...

find . -mindepth 1 -name '.*' -delete

5
rm -rf `find . -type f -regex '.*/\.+.+'`

如果你想要删除目录,那么将 -type f 改为 -type d
如果你想要删除文件和目录,则移除 -type f
更新内容感谢评论者:这对于文件名或目录名中包含空格的情况会失败。请使用更好的答案

这对于包含空格的文件名会失败。 - Dennis Williamson
@暂停直至另行通知。我不知道为什么。在哪个系统上失败了? - mamuso
1
在任何具有rmfind,像Bash或sh的shell和包含空格的文件(或目录)名称的系统上。例如,对于目录名“My Pictures”,您的命令将尝试从“My”和“Pictures”中删除文件,其中可能不存在任何一个。您应该使用find ... -exec ...而不是命令替换。 - Dennis Williamson
@DennisWilliamson 绝对没错。你的答案比我的好多了。 - mamuso

1
find /path -iname ".*" -type f -delete ;

Ruby(1.9+)

ruby -rfileutils -e 'Dir["**/.*"].each{|x| FileUtils.rm(x) if File.file?(x)}'

1
通过在“find”命令中指定“-type d”,可以轻松地实现这一点。 - kurumi
当您不需要它时,-iname 可能会慢一些。如果您包括 -type d 和以 . 开头的名称,则可能尝试删除名为 . 的当前目录。 - Dennis Williamson

0

我发现这个方法在Linux的Bash中非常有效:

find . -wholename '*/.*' -type f | sed -n '/\/\.[^\/]\+$/p' | xargs rm

您可以根据自己的喜好调整sed调用中的正则表达式。

但要小心:在我的情况下,我有很多名为.gitignore.gitkeep的隐藏文件必须被保留。请务必检查列表,看看是否有任何您想保留的内容。

我发现这个变体非常有用,它可以删除像._ANYTHING(通常是垃圾或临时文件)这样的文件:

find . -wholename '*/.*' -type f | sed -n '/\/\._[^\/]\+$/p' | xargs rm

0
我使用这个命令来删除空目录。它从底部开始,一直工作到顶部。因此,如果您引用当前路径,它不会失败。
find . -depth -type d -empty -exec rmdir {} \;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接