递归遍历文件夹并删除文件的Bash脚本

9

有没有人能给我一个bash脚本或一行命令,可以在Linux上递归地遍历当前文件夹中的每个文件夹,并删除所有以“._”开头的文件或目录?


1
仅供参考:._ 文件被称为 AppleDouble 文件。在 Mac 系统中,文件有一个数据分支和一个资源分支。资源分支通常包含诸如图标、文件在文件夹中的空间位置(在 Finder 中)以及其他元数据等信息。数据分支(实际文件)包含实际重要数据,因此丢弃 AppleDouble 文件不应该成为问题。 - dreamlax
6个回答

23

切换到你想要的根目录(或将 . 更改为该目录),然后执行:

find . -name "._*" -print0 | xargs -0 rm -rf

xargs 允许您将多个参数传递给单个命令,因此比使用find -exec语法更快。 此外,您可以一次运行此命令而不使用 | 来查看它将删除哪些文件,并确保它是安全的。


2
如果你正在处理来自Mac环境的文件,那么文件名中包含空格是很常见的,这会让你感到困惑。使用findxargs的null-delimiter选项(find . -name "._*" -print0 | xargs -0 rm -rf)可以避免这个问题。 - Gordon Davisson
2
为什么不使用-delete选项? - Michael Mior

4
find . -name '._*' -exec rm -Rf {} \;

可能需要使用 ./ 而不是 / - dreamlax
1
“the”根文件夹和“a”根文件夹之间有微妙的区别。 - dreamlax
抱歉,有点含糊不清,我并不是指根目录,所以使用"./"更为恰当。 - dnatoli

0

不要删除AppleDouble文件,你可以将它们与相应的文件合并。你可以使用dot_clean

dot_clean -- 将._*文件与相应的本地文件合并。

对于每个目录,dot_clean会根据给定参数的规则递归地将所有的._*文件与它们相应的本地文件合并。默认情况下,如果本地文件上存在的属性也存在于._文件中,则使用最新的属性。

如果没有给出操作数,则输出一个用法消息。如果给出了多个目录,则按照指定的顺序合并目录。

由于dot_clean默认递归工作,请使用:

dot_clean <directory>

如果你想关闭递归合并,请使用-f进行平面合并。

dot_clean -f <directory>

0

我之前也遇到过类似的问题(我猜你是在清理连接到 Mac 的驱动器,这些文件很多都是由 Mac 保存的),所以我写了一个简单的 Python 脚本来删除这些和其他无用的文件;也许对你有用:

http://github.com/houbysoft/short/blob/master/tidy


是的,你猜对了。据说这是苹果正在寻求解决的问题,以使Mac更加“网络友好”。 - dnatoli

0
find /path -name "._*" -exec rm -fr "{}" +;

-7

find . -name '.*' -delete

如果文件列表非常长,这个命令会更短并且执行得更好。


2
不要这样做!.*会删除你所有的点文件,而你需要它们!大家不要这样做,这是个坏主意。 - daviewales

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