Me gustaría crear muchos directorios usando mkdir
. Cada nombre de directorio consistirá en un prefijo (una cadena) y un índice (un entero). Suponga que me gustaría que el prefijo sea "s" y que los índices oscilen entre 1 y 50. Esto significa que me gustaría crear directorios titulados:
s1
, s2
, ..., s49
,s50
¿Hay alguna manera de hacer esto automáticamente mkdir
? Gracias por tu tiempo.
bash
. ¡Gracias por tu tiempo!s01
,s02
, ...,s49
,s50
. Si utilicé índices de ancho fijo,/bin/ls
casi siempre produce el orden que quiero.Respuestas:
Puede hacer esto con un script de shell.
Pure sh: esto funcionará incluso en conchas de bourne pre POSIX
Si desea crear una gran cantidad de directorios, puede hacer que la secuencia de comandos sea más rápida reduciéndola a una sola llamada
mkdir
, así como utilizando shell incorporado para pruebas y aritmética. Me gusta esto:Zsh, ksh93 o bash hacen esto mucho más fácil, pero debo señalar que esto no está integrado
mkdir
y puede no funcionar en otros shells. Para casos más grandes, también puede verse afectado por los límites en el número o el tamaño total de los argumentos que se pueden pasar a un comando.fuente
n=$(( n + 1 ))
habría sido tan estrictamente POSIX y no le costaría una subshell.[[
palabra clave no es POSIX. (Sin mencionar que[
es una concha incorporada en muchas conchas modernas.)[[
funciona en miksh88
(que es anteriorbash
), así que supuse que era POSIX. No pude encontrar ninguna mención de ello en la especificación POSIX, así que creo que tienes razón. Gracias por la info!for i in {range}
para los usuarios de shells avanzados.Uno
Dos
Esta opción funciona en bash , zsh y ksh93
Tres
fuente
$i
que simplemente crear un directorio, por ejemplomkdir s$i ; echo $i > s$i/$i
. Además, One es un ejemplo simple y agradable de usar un bucle for en bash ... en un sitio como este, no es nada improbable que un usuario novato lo vea y piense "bien, no me di cuenta de que podría hacer eso "---> iluminación.Muchas respuestas complicadas aquí, pero bash lo hace realmente fácil. Claro, la solución POSIX pura funciona, pero ¿por qué no aprovechar el
bash
shell que está utilizando, de todos modos? Puede hacerlo fácilmente con la expansión de llaves :fuente
mkdir $(seq --format 's%.0f' 1 50)
o si desea números con relleno de cero (lo que sería mejor para ordenar):
mkdir $(seq --format 's%02.0f' 1 50)
o:
mkdir s$(seq -s ' s' -w 1 50)
- tenga en cuenta la cadena 's' justo antes de la$()
, sin ella el primer directorio creado será solo '01' en lugar de 's01'y finalmente:
mkdir $(printf "s%02i " $(seq 1 50))
seq
es de GNU Coreutilscuriosamente, seq
--format
u-f
opción solo permite los tipos dobles de coma flotante de printf (como f y g. también un extraño formato hexadecimal de coma flotante para el que nunca he encontrado ningún uso). No tengo ni idea de porqué. Sería bueno si también admitiera otrosprintf(3)
tipos numéricos como entero (d, i), octal (o, U) o hexadecimal (x, X).De todos modos, un formato doble con precisión decimal 0 como
%.0f
o%02.0f
está lo suficientemente cerca de un entero para este propósito.Ver también: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html
fuente
{1,50}
o{01,50}
(para relleno cero) es mucho más fácil y más comprensible.Para ser diferente, aquí hay una solución POSIX sh que utiliza la recursividad:
fuente