2011-09-22 93 views
6

有沒有辦法處理invers bash v4 shell擴展,即。處理所有文件不像通配符?我需要rm是在這種情況下,格式'Folder-???'不是所有的文件,並想知道如果有一個較短的(即內置)的方式,然後做一個bash:反向(即不)shell通配符擴展?

for file in * 
do 
    [[ $i =~ \Folder-...\ ]] && rm '$i' 
done 

循環。 (例子不工作,順便說一句...)

只是出於bash的學習好奇心......

+0

恐怕你不能做到這一點,有使用正則表達式代替。 – TMS

+0

可能的重複[如何在unix/linux shell中進行模式匹配時使用反向或負向通配符?](http://stackoverflow.com/questions/216995/how-can-i-use-inverse-or-negative -wildcards-when-pattern-matching-in-a-unix-linu) – Johan

+1

@Tomas untrue; extglobs是可逆的。 –

回答

14
shopt -s extglob 
rm -- !(Folder-???) 
+0

+1:不知道那個。 –

3

@Dimitre有right answer對於bash。一種便攜式解決方案是使用case

for file in *; do 
    case "$file" in 
    Folder-???) : ;; 
    *) do stuff here ;; 
    esac 
done 

另一個bash的解決方案是使用圖案匹配操作者內部[[ ... ]]documentation

for file in *; do 
    if [[ "$file" != Folder-??? ]]; then 
    do stuff here 
    fi 
done 
+0

Hi @glenn,只是在兩種情況下都添加了:'case varname ...'和'[[...]]內部的_varname_'不執行shell字段/字段分割,因此標識符不需要是引用(並且在這方面的引用當然也不是有害的)。 –

2

如果你是確定與find,可以反轉find' s的預言與-not

正如

find -not -name 'Folder-???' -delete 

(注意這個遞歸匹配其他差異中殼水珠匹配,但我相信你知道find不夠好)