2010-12-10 37 views
3

是否可以通過SSH執行一個bash命令,該命令在多個目錄上循環,除了我指定的3或4之外?喜歡的東西:用於循環目錄的SSH命令除了指定的幾個之外

刪除public_html/outdated/所有目錄中/home/除了/home/exception1//home/exception2//home/exception3/

我在專用的Linux服務器HostGator的。

+0

你可能不打算對初始的斜槓'的public_html /過時/' – 2010-12-11 01:39:32

+0

你說得對,謝謝@Dennis威廉姆森我糾正它。 – filip 2010-12-11 01:42:24

回答

2

先測試!

shopt -s extglob 
rm -rf /home/!(exception1|exception2|exception3)/public_html/outdated/ 
+0

這是華麗和直接。我不確定是否需要重複例外列表中的「主目錄」。至少它沒有爲我工作,直到我將它改爲「(exception1 | exception2 | exception3)'。 – filip 2010-12-11 12:22:51

+0

此外,我需要執行'shopt -s extglob'來讓'!'操作符工作,但現在它工作得很好。 – filip 2010-12-11 12:25:54

+0

對不起,我只是在沒有想到的情況下複製並粘貼你的問題。另外,對不起,我忘了提及'extglob'。我會糾正我的答案。 – 2010-12-11 15:15:08

1

下面是一個簡單的解決方案 - 可能有更好的方法來做到這一點。

cd /home 
ls */public_html/outdated 

將你所有的那些;你可以使用grep -v從該

ls */public_html/outdated | grep -Ev ^exception1/ | grep -Ev ^exception2/ | grep -Ev ^exception3/ 

刪除線,然後使用反引號將這些反饋到rm -rf

rm -rf `ls */public_html/outdated | grep -Ev ^exception1/ | grep -Ev ^exception2/ | grep -Ev ^exception3/` 

顯然,你應該運行的中間步驟,以驗證列表之前實際上是刪除它們!

請注意,如果您的任何目錄中有空格,這可能不起作用 - 儘管/ home中的用戶名不應該。安全的方法是使用find。 (有可能是一個方式做發現排除,但我永遠記得。)

3

這是一點整行,但是我在這裏把它分解爲可讀性

find /home 
    \(-wholename '/home/exception1' 
    -o -wholename '/home/exception2' 
    -o -wholename '/home/exception3' \) 
    -prune -o 
    -wholename '*/public_html/outdated' -type d 
    -exec rm -rvf \{} \; 

強烈運行此我之前建議用-print替換-exec rm -rvf \{} \;位以驗證它是否僅打印要刪除的內容。

下面是它的工作方式:find遞歸找到東西。在\( ... \)' matches directories you want to skip entirely (ie: prune). The standard pattern for using -prune is to say what you want to prune out, then -prune -o`的東西,然後你真正想要匹配的東西。

我們想匹配public_html/outdated目錄,所以這就是-wholename '*/public_html/outdated' -type d的目的。 (-type d的意思是「是一個目錄」)。

最後是我們要執行的操作。再一次,用-print代替這部分,直到你確定它做到了你想要的。

警告:這會吐出一堆形式的警告:

find: `/home/foo/public_html/outdated': No such file or directory 

這是因爲找到的是試圖走進它只是刪除這些目錄。你可以放心地忽略這些 - 儘管有警告,但會繼續發現。

+0

您可以嘗試使用'-execdir'而不是'-exec'以及'-depth'來查看是否消除了錯誤消息。 – 2010-12-11 01:52:58

+0

@丹尼斯我還沒有試過execdir,但是我確實玩過'-depth',認爲它可以解決問題(因爲我們在刪除它時會使用子樹)。這似乎徹底打破了修剪,但是,所以我放棄了這種方法。 – 2010-12-11 02:44:20