2011-07-03 18 views
7

Estoy usando Linux y tengo la intención de eliminar algunos archivos usando shell.eliminar archivos cuando el nombre NO contiene algunas palabras

Tengo algunos archivos en mi carpeta, algunos nombres de archivo contienen la palabra "bueno", otros no. Por ejemplo:

ssgood.wmv 
ssbad.wmv 
goodboy.wmv 
cuteboy.wmv 

Quiero eliminar los archivos que no contiene "bueno" en el nombre, por lo que los archivos restantes son:

ssgood.wmv 
goodboy.wmv 

Cómo hacer que el uso de rm con cáscara? Intento usar

rm -f *[!good].* 

pero no funciona.

¡Muchas gracias!

+2

Qué quiere decir "de archivos ** ** nombres contienen 'bueno'"? El ejemplo parece indicar nombres de archivo, pero usted dice que los "archivos contienen la palabra" ... – sarnold

+0

Los nombres de archivo * contienen bien. No soy un hablante nativo de inglés. Gracias 4 heads-up. – DocWiki

Respuesta

16

Este comando debe hacer lo que se necesita:

ls -1 | grep -v 'good' | xargs rm -f 

probablemente lo hará correr más rápido que otros comandos, ya que no implica el uso de una expresión regular (que es lento, e innecesario para tal un simple operación).

+1

+1. En realidad, 'grep' tiene potencia de expresión regular * y * es cegadora rápidamente. –

+2

Como está, esto no funcionará porque el comando 'ls' lista múltiples nombres de archivo por línea. Necesita agregar la opción '" -1 "' _ "one-file-per-line" _ como así: 'ls -1 | grep ... ' – ridgerunner

+0

Hmm ... En mi sistema' ls' siempre muestra un archivo por línea, por lo que funcionó perfectamente. Extraño, probablemente sea una opción predeterminada en alguna parte.De todos modos, he agregado la opción '-1' para que siempre funcione. – EdoDodo

4

Puede utilizar find con el operador -not:

find . -not -iname "*good*" -a -not -name "." -exec rm {} \; 

He usado -exec llamar rm allí, pero me pregunto si find tiene un sistema incorporado en acción de eliminaciónlo hace, ver más abajo.

Pero muy cuidado con eso. Tenga en cuenta en lo anterior que he tenido que poner una cláusula -a -not -name ".", porque de lo contrario coincidía con ., el directorio actual. ¡Así que probaría a fondo con -print antes de poner en el bit -exec rm {} \;!

Actualización: Sí, nunca lo he usado, pero de hecho hay una acción -delete. Entonces:

find . -not -iname "*good*" -a -not -name "." -delete 

De nuevo, tenga cuidado y compruebe que no coincidan más de lo que desea emparejar primero.

+1

Sugerencia especialmente agradable para usar '-print' primero. :) – sarnold

6

Con bash, se puede obtener a través de la opción "negative" matchingextglob shell:

shopt -s extglob 
rm !(*good*) 
Cuestiones relacionadas