2010-01-06 136 views
130

有没有人有解决方案来删除那些讨厌的._和.DS_Store文件后,将文件从Mac移动到Linux服务器?Bash:递归删除文件

指定一个启动目录并让它启动?喜欢的/ var/www/html等/向下...

+0

虽然它不是重复的IMO,但应该带al ook在这:http://stackoverflow.com/questions/1280429/delete-all-files-but-keep-all-directories-in-a-bash-script – Grundlefleck 2010-01-06 22:36:54

+0

虽然不是你在问什么。我会认为这是一个更好的解决方案:http://unix.stackexchange.com/questions/9665/create-tar-archive-of-a-directory-except-for-hidden-files – Viktor 2014-06-25 10:38:39

回答

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 2011-08-17 08:44:23

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

对每个找到的文件使用exec并不快。打印出来然后用xargs调用rm会更快。 – 2010-01-06 22:38:02

+3

但是,如果你有一个'find'支持它,'+'是类似于xargs的:'find。 -name“FILE-TO-FIND”-exec rm -rf {} +' - (同样,你在'-exec'之前缺少一个空格) – 2010-01-07 02:38:28

+2

我们在我的日子里从来没有过xargs。我们不得不步行去学校,上山两路....... – 2012-07-07 01:02:26

160

文件的目录,并使用:

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

没有测试,试戴没有xargs的第一!

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

find /dir/here ... 
+2

我知道他的问题没有要求它,但我永远不会记得:你的例子处理空格的文件名? – Grundlefleck 2010-01-06 22:41:58

+4

是的,这就是printar和-0到xargs的用途。通常它不会正确处理空格,但是使用print0它将在行的末尾打印一个空字符的文件名,然后带-0的xarg将用于将完整路径传递给xargs,而不会有空白正在使用rm命令的第二个或第三个参数,这可能非常糟糕! – 2010-01-06 22:47:11

+0

@ X-Istence - 这不会递归地遍历子目录,但对吗? – 2010-01-06 22:52:41

6

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

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

您也可以将它们组合起来像这样:

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

岩组有很多是bash的缺乏等特点,但一个一个人值得为之转换。它可用于大多数(可能所有)Linux发行版以及cygwin和OS X.

您可以在zsh site找到更多的信息。

+1

可能存在的问题:由于您不使用xargs,因此您可能会遇到命令行参数长度限制。另外,Bash4也支持'**':-)(虽然不是默认情况下,需要设置'shop-globstar') – ephemient 2010-01-06 23:26:22

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

'-delete'标志很棒,谢谢。 – 2012-05-11 18:47:01

+1

这非常有用,谢谢! – corazza 2012-09-26 14:57:34

+2

+1 -delete,THX – Chris 2013-02-06 12:27:30

1

,如果你有猛砸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的每个文件的新副本是一种浪费。 – 2010-01-08 17:16:18

+2

@ X-Istence过早的优化是浪费 – Lucina 2011-11-16 12:32:50

+8

香蕉好吃.... – Matt 2012-10-20 18:59:05

18

简单的命令:

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

祝你好运!

+1

这个伟大的工程。但谨慎的说法是,我只是使用了'rm -i'find ./ -name'* py'' -rf',它并没有提示我删除文件。你需要把它放在最后(即'-rfi')。感谢上帝为我的备份脚本。 – ryanjdillon 2013-04-24 19:11:40

+1

如果有太多的文件,这打破了错误:'-bash:/斌/ RM:参数列表太long' – Viktor 2014-06-25 10:46:55

78

较新的findutils支持-delete,所以:

find . -name ".DS_Store" -delete 

会为你工作,如果你有一个上最新的POSIX系统,我相信。至少它适用于我在OS X 10.8上,

在@ X-Istence的帖子的评论中认为@ephemient(认为它足够有用以保证它自己的答案)。

+1

工作早在OSX 10.6为好。 – hoss 2013-12-12 14:40:38

+3

最干净和最简单的解决方案,+1! – limist 2014-02-19 10:20:54

+6

@OneOfOne:正如我的评论所说,我从@ ephemient得到了这个。作为bash的初学者,我发现你的(也许更正确的)解决方案的可读性和可用性要差得多。它们可能在功能上是相同的,但我觉得这个语法提供了更多的清晰度 – rattray 2014-03-06 18:30:47

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 {} \; 
3

删除“拇指”的示例。DB”递归;

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

验证通过:

find . -iname "Thumbs.db" 

这应该现在,不显示任何与项目的 “Thumbs.db” 这个,当前路径内

3

这是更好。通过加入-print来查看要删除的内容-print this answer

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