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
bash
unix
command-line
ls
Matt Keene
fuente
fuente
Respuestas:
Puede usar la expansión de llaves:
Los ceros iniciales se pueden incluir si es necesario:
fuente
{25..50..2}
.No directamente, pero puede usar múltiples patrones globales:
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.
fuente
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:
No sé si es posible y cómo eventualmente generalizar esto con grep.
fuente
Es posible lograr una mayor portabilidad o flexibilidad utilizando un
for
bucle yprintf
:Esto maneja bien los espacios y los resultados se adaptan bien a las tuberías
xargs
para 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
||true
suprime un retorno de error de nivel bash.Sin embargo, en el caso básico, usar
for
yprintf
no es diferente al más conciso:fuente
for i in {025..050} ; do ... ; done