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

Matt Keene
fuente
Como referencia: coincidencia de patrones , engrosamiento
ignis

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
chepner
fuente
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.

Celada
fuente
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.

Heisenbug
fuente
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
sin bar
fuente
Si desea separar los resultados de la expansión de for i in {025..050} ; do ... ; done
llaves