2015-12-03 542 views
4

所以使用外殼,並具有目錄:刪除所有目錄,除了一個

./parent 
./parent/one 
./parent/two 
./parent/three 
./parent/four 

我想這樣做rm -rf parent/*在一個命令,但保持一個目錄,比如「四」,所以最終結果將是

./parent 
./parent/four 

回答

13

隨着bash您可以用shoptextglob選項做到這一點。

shopt -s extglob 
cd parent 
rm -rf !(four) 

在POSIX殼我想你使用一個循環做到這一點

for dir in ./parent/*; do 
    [ "$dir" = "four" ] && continue 
    rm -rf "$dir" 
done 

或使用數組來運行rm只有一次(但它需要陣列或使用"[email protected]"

arr=() 
for dir in ./parent/*; do 
    [ "$dir" = "four" ] && continue 
    arr+=("$dir") 
done 
rm -rf "${arr[@]}" 

for dir in ./parent/*; do 
    [ "$dir" = "four" ] && continue 
    set -- "[email protected]" "$dir" 
done 
rm -rf "[email protected]" 

或者你使用find

find ./parent -mindepth 1 -name four -prune -o -exec rm -rf {} \; 

或(與find-exec +,以節省一些rm執行)

find ./parent -mindepth 1 -name four -prune -o -exec rm -rf {} + 

哦,否則假定目錄的列表不是太大,笨重我猜你總是可以使用

rm -rf parent/*<ctrl-x>* 

then de從命令行中輸入parent/four條目,並點擊輸入,其中<ctrl-x>*glob-expand-word的readline的默認綁定。

+0

優秀的答案。我通常只是'mv'目錄並刪除其他所有內容。 ;)+1 – erip

+0

@erip嘿,是的,在許多情況下,這當然是一個更容易的途徑。雖然'extglob'幾乎是一樣簡單。 –

+1

小心!寫出來的'find'也會匹配'。/ parent'! – pilcrow

相關問題