Cree un directorio llamado 0001 en lugar de 1 en un bucle de script bash

10

En la siguiente secuencia de comandos bash si j = 0000, ¿cómo debo cambiar la siguiente secuencia de comandos bash para crear directorios con el nombre 0001, 0002, ...? En realidad, crea directorios denominados 1, 2, 3

for i in *.jpg; do let j+=1 ; mkdir $j ; done

¡Gracias!

Marcello
fuente

Respuestas:

13

Su script actual usa solo un valor decimal, esto obviamente se traduce en el valor sin ceros a la izquierda.

Tendría que rellenar la cadena a la longitud de 4 caracteres, con ceros a la izquierda. Para ello, utilice las teclas ``de retroceso para obtener el resultado de la llamada printf printf %04d $j.

Como resultado, debe tener el comando completo:

for i in *.jpg; do let j+=1; mkdir `printf %04d $j`; done

Fuente: StackOverflow: bash - Relleno de ceros en una cadena

(Obviamente, también vea las respuestas adicionales a esa pregunta, si desea una solución más profunda, pero esto definitivamente funciona perfectamente para este caso de uso).

usuario98085
fuente
5

Usando bash, tu mejor opción es:

mkdir {0001..0666}

para crear directorios con nombre 0001a 0666(con cero relleno).

Si quieres directorios llamado prefix0001suffix, prefix0002suffix... a continuación:

mkdir prefix{0001..0666}suffix

lo haré

Si solo desea nombres de directorio de números impares

mkdir {0001..0666..2}

y así sucesivamente ... Consulte Expansión de llaves en el bashmanual de referencia .

Como señala FEichinger, debe saber de antemano el número de directorios. Si quieres una solución que sea cercana a la tuya, pero realmente segura y que use un modismo de bash más moderno:

for i in *.jpg; do ((++j)); mkdir $(printf "%04d" $j) ; done
gniourf_gniourf
fuente
Esto solo es útil para crear una cantidad previamente conocida de directorios. Por lo general, cuando usa directorios numerados, se encuentra dentro de un contexto dinámico, lo que significa que debe determinar la cantidad en tiempo de ejecución y, por lo tanto, aún necesita relleno de cadena. Sin embargo, depende del caso de uso específico.
usuario98085
@FEichinger ¡Correcto! publicación editada en consecuencia.
gniourf_gniourf