Tengo un conjunto de archivos en un directorio numerado de la siguiente manera:
file1.txt
file2.txt
...
file30.txt
...
Ahora, me gustaría ejecutar un comando en un rango específico de archivos, digamos 18 a 31.
Hasta ahora he usado las siguientes formas,
tres argumentos
command file1[8-9].txt file2[0-9].txt file3[0-1].txt
Ahora supongamos que quiero cualquier otro número,
lazo
for i in `jot - 18 31 2`; do echo file${i}.txt; done | xargs command
Parece que es un bucle más confiable (los espacios funcionan)
for i in `jot - 18 31 2`; do echo "\"file${i}.txt\" "; done | xargs command
pero parece que debería haber una manera más simple de hacer esto. Supongo que la mejor solución es crear una función bash que devolverá el conjunto de archivos a la línea de comandos. Entonces podría hacer algo como,
command `filerange file 18 31`
¿Hay mejores formas o sugerencias para hacerlo de manera eficiente?
Pido disculpas por adelantado si me perdí esta misma pregunta respondida en otro lugar en la web o en superuser
.
for
bucle que permita espacios en los nombres de archivo usando xargs. Parece que funciona si no tienes bash 4. Si tienes bash 4, ¡definitivamente usa expansión de llaves! Ver la respuesta seleccionada. Plug desvergonzado para actualizar Snow Leopard bashRespuestas:
Prueba esto:
Se conoce como una "expresión de secuencia" y es parte de la función de expansión de llaves de Bash . Funciona en Bash 3 y 4.
La función de incremento es nueva para Bash 4. Probablemente tenga Bash 3.x.
En Bash 4, puedes hacer:
Pero en Bash 3, debes hacer esto para obtener los mismos resultados:
La misma forma que se incrementa en uno:
Cualquiera de los números pueden ser variables o expresiones. Sin embargo, en una expresión de secuencia, los números tienen que ser constantes
Aquí hay un ejemplo usando ese formulario en sus archivos:
Otra nueva característica de las expresiones de secuencia en Bash 4 es la capacidad de incluir ceros a la izquierda. Esto es útil si desea crear (y usar) archivos numerados que puedan ordenarse correctamente.
En Bash 4:
crearía archivos llamados "file001.txt" a través de "file010.txt". Sus nombres se ordenarán en el orden esperado. Sin los ceros a la izquierda, "file10.txt" se ordenaría antes de "file1.txt".
Para trabajar con los archivos, puede usar la misma sintaxis cero inicial:
En Bash 3, si necesita ceros a la izquierda, debe rellenar el valor usted mismo:
los
printf
declaración antepondrá el valor de i con ceros a la izquierda para que el ancho sea 3, por ejemplo ("4" se convierte en "004").Editar:
Acomodar espacios en los nombres de archivo es sencillo:
fuente
{1..10..2}
a trabajar en mi OSX bash.{01..10}
son nuevos en Bash 4. Probablemente tenga Bash 3.x. Si necesita la función de incremento o para usar variables para los límites del rango, entonces use este formulario:for ((i=1; i<=10; i+=2}
(oi++
para incrementar en uno). Cualquiera de los números pueden ser variables o expresiones. Luego, para usar el valor dentro delfor
ciclo:echo "file${i}.txt". In Bash 3, if you need leading zeros, inside the for loop do:
printf -vi '% 03d' $ i` que antepondrá el valor dei
ceros a la izquierda para que el ancho sea 3, por ejemplo ("4" se convierte en "004").