2011-09-22 9 views
6

¿Hay alguna manera de manejar la expansión de shell invers bash v4, es decir. tratar todos los archivos NO como un comodín? Necesito rm todos los archivos que no son del formato 'Folder-???' en este caso y se preguntaba si hay un más corto (es decir. Incorporado) forma a continuación, haciendo un buclebash: ¿Inverso (es decir, NO) expansión de comodín de shell?

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

. (El ejemplo no funciona, por cierto ...)

Sólo por curiosidad fiesta de aprendizaje ...

+0

Me temo que no se puede hacer eso y tener para usar expresiones regulares en su lugar. – TMS

+0

posible duplicado de [¿Cómo puedo usar comodines inversos o negativos cuando coinciden los patrones en un shell de 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 untrue; Los extglobs son reversibles. –

Respuesta

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

+1: No sabía eso. –

3

@Dimitre tiene la right answer de fiesta. Una solución portátil es utilizar case:

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

Otra fiesta es utilizar el operador de coincidencia de patrones dentro [[ ... ]] (documentation)

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

Hola @glenn, solo para agregar que en ambos casos: 'case varname ...' y _varname_ inside '[[...]]' no se realiza división de palabra/campo de shell, por lo que el identificador no necesita ser citado (y las citas en este contexto, por supuesto, tampoco son perjudiciales). –

2

En caso de que estás bien con find, se pueden invertir find ' s predicados con -not.

Como en

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

(tenga en cuenta esto coincide de forma recursiva entre otras diferencias que desembolsar juego pegote, pero supongo que saber find lo suficientemente bien)

Cuestiones relacionadas