是否可以通過SSH執行一個bash命令,該命令在多個目錄上循環,除了我指定的3或4之外?喜歡的東西:用於循環目錄的SSH命令除了指定的幾個之外
刪除public_html/outdated/
所有目錄中/home/
除了/home/exception1/
,/home/exception2/
和/home/exception3/
我在專用的Linux服務器HostGator的。
是否可以通過SSH執行一個bash命令,該命令在多個目錄上循環,除了我指定的3或4之外?喜歡的東西:用於循環目錄的SSH命令除了指定的幾個之外
刪除public_html/outdated/
所有目錄中/home/
除了/home/exception1/
,/home/exception2/
和/home/exception3/
我在專用的Linux服務器HostGator的。
先測試!
shopt -s extglob
rm -rf /home/!(exception1|exception2|exception3)/public_html/outdated/
下面是一個簡單的解決方案 - 可能有更好的方法來做到這一點。
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
。 (有可能是一個方式做發現排除,但我永遠記得。)
這是一點整行,但是我在這裏把它分解爲可讀性
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
這是因爲找到的是試圖走進它只是刪除這些目錄。你可以放心地忽略這些 - 儘管有警告,但會繼續發現。
您可以嘗試使用'-execdir'而不是'-exec'以及'-depth'來查看是否消除了錯誤消息。 – 2010-12-11 01:52:58
@丹尼斯我還沒有試過execdir,但是我確實玩過'-depth',認爲它可以解決問題(因爲我們在刪除它時會使用子樹)。這似乎徹底打破了修剪,但是,所以我放棄了這種方法。 – 2010-12-11 02:44:20
你可能不打算對初始的斜槓'的public_html /過時/' – 2010-12-11 01:39:32
你說得對,謝謝@Dennis威廉姆森我糾正它。 – filip 2010-12-11 01:42:24