2011-09-22 5 views
6

Czy istnieje sposób obsługi inwersji rozszerzeń powłoki bash v4, tj. traktować wszystkie pliki NIE jak symbole wieloznaczne? Muszę rm wszystkie pliki, które nie są w formacie 'Folder-???' w tym przypadku, i zastanawiałem się, czy jest krótszy (np. Wbudowana) sposób wtedy robibash: Inwersja (tj. NOT) rozszerzenie wildcard powłoki?

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

pętlę. (Przykład nie działa, btw ...)

Tak z ciekawości ... bash uczenia

+0

Obawiam się, że nie może tego zrobić i mieć zamiast tego używać wyrażeń regularnych. – TMS

+0

możliwy duplikat [Jak używać odwrotnych lub negatywnych symboli wieloznacznych podczas dopasowywania wzorca w powłoce unix/linux?] (Http://stackoverflow.com/questions/216995/how-can-i-use- inverse-or-negative -wildcards-when-pattern-matching-in-a-unix-linu) – Johan

+1

@ Tomas nieprawdziwe; extglobs są odwracalne. –

Odpowiedz

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

+1: Nie znałem tego. –

3

@Dimitre ma right answer dla bash. Przenośny rozwiązaniem jest użycie case:

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

Innym bash jest użycie operatora pasujący wzór wewnątrz [[ ... ]] (documentation)

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

Hi @glenn, aby dodać, że w obu przypadkach: 'case nazwa_zmiennej ...' i _nazwisko_wewnątrz '[[...]]' nie jest wykonywane żadne słowo powłoki/podział pola, więc identyfikator nie musi być cytowane (i cytowanie w tym kontekście, oczywiście, również nie jest szkodliwe). –

2

W przypadku, gdy jesteś ok z find można odwrócić find ' s predykaty z -not.

jak w

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

(uwaga ta odpowiada rekurencyjnie wśród innych różnic zapłacić dopasowanie glob, ale zakładam, że wiesz find wystarczająco dobrze)