递归删除文件


140

有谁能解决从Mac将文件移动到Linux服务器之后删除那些令人讨厌的._和.DS_Store文件的解决方案?

指定一个开始目录,然后放开它?像/ var / www / html /下...


尽管这不是一个重复的海事组织,你应该看看这个:stackoverflow.com/questions/1280429/...
Grundlefleck

虽然不是您要问的。我认为这是一个更好的解决方案:unix.stackexchange.com/questions/9665/…–
Viktor

Answers:


169

转到目录,并使用:

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

未经测试,请先尝试使用不带xargs的产品!

您可以将查找后的时间段替换为目录,而不是先更改为目录。

find /dir/here ...

2
我知道他的问题并没有要求,但我永远不记得:您的示例处理带空格的文件名吗?
Grundlefleck 2010年

4
是的,这就是print0和xargs的-0的用途。通常,它不会正确处理空格,但是使用print0时,它将在行末打印带有空字符的文件名,然后带-0的xarg会将完整路径传递给xargs,而不会出现空格在rm命令中使用第二个或第三个参数,可能真的很糟糕!
X-Istence'1

7
@X:较新的findutils支持-delete操作,可以缩短操作时间。@JT:该搜索在下进行递归搜索.。取决于有多少个文件和子目录...您不能只是禁止上传这些文件和子目录吗?
短暂

1
-r在这种情况下,不建议使用(递归)标志,因为您不想删除任何目录。–
Daniel Zohar 2013年

2
@IlmariKaronen:好点。岂不command rm是更好(更直接)的解决方案吗?(通过“直接”,我的意思是它专门处理手头的问题,而没有别的,因此不太可能产生任何有害的副作用,并且对于必须维护代码的任何人也将更加不言自明。稍后)
。– iconoclast

93
find /var/www/html \( -name '.DS_Store' -or -name '._*' \) -delete

86

较新的findutils支持-delete,因此:

find . -name ".DS_Store" -delete

添加-print还可以获取删除列表。

我相信,如果您拥有最新的POSIX系统,那么Command将会为您服务。至少它在OS X 10.8上对我有效,并在macOS 10.12(Mojave)上对其进行了测试的其他人也可以使用。

感谢@ephemient在@ X-Istence的帖子中的评论(认为它很有用,足以保证自己的回答)。


1
也可以在OSX 10.6中使用。
hoss 2013年

3
+1最干净,最简单的解决方案!
limist 2014年

6
@OneOfOne:正如我的评论所说,我来自@ ephemient。作为初学者,我发现您的(也许更正确的)解决方案可读性和可用性较低。它们在功能上可能相同,但是我发现此语法提供了更多的清晰度。
拉特雷

1
“。” 不需要,因为find默认情况下会递归到当前工作目录。
汤姆·罗素

在较新版本的程序中,该目录可能会省略,这将暗示当前的工作目录Wikipedia)。您仍然需要.在macOS 10.12(Sierra)上。
Dem Pilafian '16

18

简单命令:

rm `find ./ -name '.DS_Store'` -rf
rm `find ./ -name '._'` -rf

祝好运!


1
这很好。但请注意,我只是使用此rm -i 查找。/-name'* py'` -rf , which did NOT prompt me to delete files. you will need to take it on the end (i.e. -rfi`)。感谢上帝提供我的备份脚本。
ryanjdillon

1
如果文件太多,则会因错误而中断:-bash: /bin/rm: Argument list too long
Viktor 2014年

12
cd /var/www/html && find . -name '.DS_Store' -print0 | xargs -0 rm
cd /var/www/html && find . -name '._*' -print0 | xargs -0 rm

2
我更喜欢这一点,只是因为“ rm”没有“ -r”,这对于此特定任务不是必需的。
lotsoffreetime

6

您可以切换到zsh而不是bash。这使您可以使用**匹配目录树中任何位置的文件:

$ rm /var/www/html/**/_* /var/www/html/**/.DS_Store

您还可以像这样组合它们:

$ rm /var/www/html/**/(_*|.DS_Store)

Zsh还有bash缺少的许多其他功能,但值得一提的是。大多数(可能是所有)Linux发行版以及cygwin和OS X中都可以使用它。

您可以在zsh网站上找到更多信息。


1
一个可能的问题:由于您不使用xargs,因此您可能会遇到命令行参数长度限制。另外,Bash 4也支持:-) **(尽管不是默认情况下,shopt -s globstar需要设置)
ephemient 2010年

4
find . -name "FILE-TO-FIND"-exec rm -rf {} \;

对找到的每个文件使用exec并不是很快。find将它们打印出来然后使用xargs一次调用rm更快。
X-Istence'1

3
但是,如果您有一个find支持它的文件,+则类似于xargs:-(find . -name "FILE-TO-FIND" -exec rm -rf {} +而且,您在之前缺少空格-exec
已暂停,直到另行通知。

3
我们这一天从来没有过xargs。而且我们不得不步行去上学,双向。.......–
马丁·贝克特

3

递归删除“ Thumbs.db”的示例;

find . -iname "Thumbs.db" -print0 | xargs -0 rm -rf

验证依据:

find . -iname "Thumbs.db"

现在,这应该不会在当前路径中显示任何带有“ Thumbs.db”的条目。


请确保您的答案会打印出要删除的内容的列表,并解释为什么有人要使用xargsprint0不是exec(有原因)。
乔什·哈布达斯


2

如果您有Bash 4.0 ++

#!/bin/bash
shopt -s globstar
for file in /var/www/html/**/.DS_Store /var/www/html/**/._ 
do
 echo rm "$file"
done

2
为每个文件运行一个新的rm副本很浪费。
X-Istence

2
@ X-Istence过早的优化很浪费
Lucina

为独创性和使用最新bash创新而投票。
乔什·哈布达斯

1

注意事项:

'-delete'不是递归的。因此,如果.TemporaryItems(文件夹)中包含文件,该命令将失败。

Macs创建了许多讨厌的文件:.DS_Store ._。DS_Store .TemporaryItems .apdisk

此命令可解决所有这些问题。一遍又一遍地运行查找来保存多个匹配项。

find /home/foo \( -name '.DS_Store' -or -name '._.DS_Store' -or -name '._*' -or -name '.TemporaryItems' -or -name '.apdisk' \) -exec rm -rf {} \;

0

这也适用:

sudo rm -rf 2018-03-*

在这里您删除的文件的名称格式为2018-03-(其他)

把事情简单化


您不会解释什么时候有人想给命令加上前缀,sudo也不会提供任何信息来说明rm您的答案如何工作。
乔什·哈布达斯
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.