
¿Cómo puedo encontrar y eliminar todos los .jpg
archivos 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 sample
el 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
find
que se ignoren todos los archivos que contengansample
su nombre. Eli
in-iname
hace 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
find
que 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 -delete
el 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