eliminar archivos que coinciden con el patrón

32

Necesito eliminar recursivamente todos los archivos en todos los subdirectorios donde el nombre de archivo contiene un número seguido de una 'x' seguida de un número, al menos dos veces.

Ejemplo:

Me gustaría eliminar estos archivos:

'aaa-12x123-123x12.jpg'
'aaa-12x12-123x12-12x123.jpg'

Pero NO quiero eliminar estos archivos:

'aaa.jpg'
'aaa-12x12.jpg'
'aaaxaaa-123x123.jpg'
'aaaxaaa-aaaxaaa.jpg'

¿Cómo puedo hacer eso (desde el shell bash)

Mikkelbreum
fuente

Respuestas:

61

Una cadena contiene "un número seguido de un xseguido de un número" si y solo si contiene un dígito seguido de un xseguido de un dígito, es decir, si contiene una subcadena que coincida con el patrón [0-9]x[0-9]. Entonces está buscando eliminar los archivos cuyo nombre coincide con el patrón *[0-9]x[0-9]*[0-9]x[0-9]*.jpg.

find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' -delete

Si findno tiene -delete, llame rmpara eliminar los archivos.

find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' -exec rm {} +
Gilles 'SO- deja de ser malvado'
fuente
2
¡Gracias! 12,000 archivos desaparecidos i 2 seg. ¡Eso me ahorró algo de trabajo manual!
mikkelbreum
Ni -deletetampoco -exec rmtrabajado para mí en Bash en Windows. Pero esto hizo:find /path/to/directory -type f -name '*[0-9]x[0-9]*[0-9]x[0-9]*.jpg' | xargs rm
Tamlyn
2
@Tamlyn Use -print0y xargs -0, de lo contrario, el comando fallará con los nombres de archivo que contienen espacios o comillas simples. Sin embargo, -deletey -exec rm hacer el trabajo en Windows. Si algo no funciona, no se debe a su uso.
Gilles 'SO- deja de ser malvado'
¿Funcionará esto también con Windows?
CodyBugstein
Funcionará si tiene un puerto de utilidades Unix como Cygwin o GNUWin32. Obviamente no funcionará de fábrica en Windows. Tenga cuidado de que Windows tenga un programa no relacionado llamado find, así que asegúrese de que las utilidades de Unix sean las primeras PATH.
Gilles 'SO- deja de ser malvado'
0

El comando correcto es:

find . -type f -iregex '.*[0-9]x[0-9]*\.jpg$'

esto tomará solo archivos con nombres: 'aaa-12x12.jpg', pero no 'aaa-12x12red.jpg'

MasterR
fuente