Lista de rango de archivos con comodines UNIX


14

Digamos, por ejemplo, que tengo los siguientes archivos en mi directorio de trabajo: mjk0001.fits, mjk0002.fits, ... aumentando numéricamente hasta mjk9999.fits.

¿Hay alguna manera de usar comodines UNIX para enumerar u operar en un grupo secuencial de ellos? Por ejemplo, si necesito ejecutar un proceso de 0025 a 0050, ¿qué formato usaría?

He intentado lo siguiente pero no he tenido éxito:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

Gracias de antemano a todos, MK


Respuestas:


20

Puede usar la expansión de llaves:

ls mjk00{25..50}.fits

Los ceros iniciales se pueden incluir si es necesario:

ls mjk0{000..149}.fits

1
El uso de esta sintaxis, también puede especificar un valor de paso: {25..50..2}.
nobar

1

No directamente, pero puede usar múltiples patrones globales:

ls mjk002[56789].fits mjk00[34]?.fits

No es exactamente lo que está buscando, pero es lo más cercano que ofrecen los patrones globales, y ciertamente es mejor que escribir cada sistema de archivos. Al menos el número de patrones que necesitará por rango numérico está limitado por el registro de los puntos finales numéricos del rango.


1

Podrías usar una expresión regular con grep. No soy un gurú de expresiones regulares. Lo siguiente devuelve el patrón con los números entre 25-50:

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

No sé si es posible y cómo eventualmente generalizar esto con grep.


0

Es posible lograr una mayor portabilidad o flexibilidad utilizando un forbucle y printf:

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

Esto maneja bien los espacios y los resultados se adaptan bien a las tuberías xargspara su posterior procesamiento.

Los números con múltiples coincidencias darán como resultado que se enumeren todos los archivos coincidentes.

Los números sin coincidencias informarán un error en stderr, pero ||truesuprime un retorno de error de nivel bash.


Sin embargo, en el caso básico, usar fory printfno es diferente al más conciso:

ls --escape mjk{0025..0050..1}* ||true

Si desea separar los resultados de la expansión de for i in {025..050} ; do ... ; done
llaves
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.