2010-01-06 137 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