2009-08-25 57 views
17

刪除CVS目錄到目前爲止,我想出了這一點:腳本遞歸服務器上

find . -name 'CVS' -type d -exec rm -rf {} \; 

它是迄今爲止當地工作,任何人都可以看到任何潛在的問題?我希望這基本上遞歸刪除'CVS'目錄意外上傳到服務器。

另外,我怎樣才能使它成爲一個腳本,我可以指定一個目錄來清理?

回答

13

嗯,很明顯的一點:它會刪除名爲CVS的目錄,不管他們是CVS目錄與否。

你可以把它變成一個腳本很容易:

#!/bin/sh 

if [ -z "$1" ]; then 
    echo "Usage: $0 path" 
    exit 1 
fi 

find "$1" -name 'CVS' -type d -print0 | xargs -0 rm -Rf 
# or find … -exec like you have, if you can't use -print0/xargs -0 
# print0/xargs will be slightly faster. 
# or find … -exec rm -Rf '{}' + if you have reasonably modern find 

編輯

如果你想讓它更安全/多防呆,你可以在第一,如果後做這樣的事情/ Fi塊(有幾種方式來寫這個):

⋮ 
case "$1" in 
    /srv/www* | /home) 
     true 
     ;; 
    *) 
     echo "Sorry, can only clean from /srv/www and /home" 
     exit 1 
     ;; 
esac 
⋮ 

你可以把它作爲看上你想要的(例如,而不是放棄,很可能促使如果你真的打算這樣做)。或者你可以讓它解決相對路徑,所以你不必總是指定一個完整的路徑(但是,然後再次,也許你想這樣做,更安全)。

+0

像這樣使用xargs的主要擔憂是,如果有足夠的匹配目錄,則可能會溢出傳遞給「rm -Rf」的命令行的大小。由「-s」的默認值提供的限制應該防止xargs這樣做,我仍然在一些平臺上遇到它;該檢查在任何地方似乎都不可靠。爲了避免這裏出現任何問題,我總是使用「-n 1」作爲xargs的參數,所以我得到了處理所有管道輸入的好處,沒有溢出問題。那時你可能會使用exec,因爲你所瞄準的效率增益消失了。 –

+0

有趣。這個腳本無法使用rm -rf /因爲這個名字必須是'CVS',對吧?只是想確定,嘿。 –

+0

@meder:正確,由於'-name',它不能'rm -Rf /'。當然,它可以愉快地移除坐在'/ srv/CVS'中的CVS倉庫。您可能希望添加進一步的測試以使其更安全。 – derobert

2

一個簡單的方法是:

發現。 -iname CVS -type d | xargs的RM -rf

+2

不,如果任何CVS目錄的路徑中有空格,那會很糟糕。你需要'find ... -print0 | xargs -0 ...' – derobert

+2

另外,由於CVS目錄總是大寫,'-iname'只是乞求誤報。 – derobert