Cómo eliminar recursivamente todos los archivos JPG, pero conservar los que contienen "muestra"

Cómo eliminar recursivamente todos los archivos JPG, pero conservar los que contienen "muestra"

¿Cómo puedo encontrar y eliminar todos los .jpgarchivos en un árbol de directorios con excepción de los que contienen "muestra" en su nombre de archivo?

Por ejemplo :

a.zip          ->  keep it  
b.jpg          ->  delete it  
a-sample.jpg   ->  keep it  
b-Sample.jpg   ->  keep it  

Respuesta1

Para eliminar todos los archivos que terminan en . jpg(no distingue entre mayúsculas y minúsculas), excepto para los archivos con sampleel nombre del archivo (no distingue entre mayúsculas y minúsculas:

find . ! -iname '*sample*'  -iname '*.jpg' -delete

Esto se repite en todos los directorios del árbol comenzando en el directorio actual.

Cómo funciona:

  • .

    Esto especifica que comenzamos con el directorio actual.

  • ! -iname '*sample*'

    Esto indica findque se ignoren todos los archivos que contengan samplesu nombre. El iin -inamehace que esta prueba no distinga entre mayúsculas y minúsculas.

  • -iname '*.jpg'

    Esta condición, que va acompañada de la anterior, busca archivos que terminen en .jpg.

  • -delete

    Esto indica findque se eliminen todos esos archivos.

Antes de ejecutar el comando anterior, es posible que desees probarlo. Correr:

find . ! -iname '*sample*'  -iname '*.jpg'

Esto imprimirá los archivos de interés. Si esta lista es buena, ejecute el comando nuevamente con -deleteel archivo adjunto.

Respuesta2

En bash, puedes usar

shopt -s extglob

para habilitar la coincidencia negativa:

rm !(*[Ss]ample*).jpg

Para hacer coincidir las subcarpetas también, active

shopt -s globstar

y usa la estrella doble:

rm **/!(*[Ss]ample*).jpg

información relacionada