Creación de directorios y subdirectorios de secuencias de comandos según la entrada del usuario

Creación de directorios y subdirectorios de secuencias de comandos según la entrada del usuario

Hola, solo soy un aficionado novato, así que espero que esta no sea una pregunta demasiado simple.

Estoy intentando escribir un script que me permita generar la estructura de archivos completa para mis medios utilizando únicamente las entradas del usuario. Tengo todo funcionando excepto en la línea 20 donde vive 'mkdir Season{1..$user_input4}. Me gustaría tomar el input_4 del usuario y crear 1 + esa cantidad de directorios, pero creo que puedo estar viendo esto desde una perspectiva equivocada, ya que en su lugar crea un subdirectorio llamado Season{1..(imprime la entrada del usuario)}.

#!/bin/bash
file_created="Directory Created"
directory_number=0
echo "How many directories should be created?"
read user_input
while [ $directory_number -ne $user_input ]
do 
    echo "Enter Directory Name"
    read user_input2 
        mkdir $user_input2
    directory_number=$((directory_number + 1))
echo "Do you want to create Seasons? Y/N"
    read user_input3
    if [ $user_input3 == "Y" ]
    then
        echo "Enter number of seasons"
            read user_input4
        cd $user_input2/
        mkdir Season{1..$user_input4}
        cd ..
    else
    :
    fi
done

Si alguien tiene alguna idea, sería muy apreciada. ¡Gracias!

Respuesta1

No funciona de esta manera porque:

El orden de las expansiones es:expansión de corsé; expansión de tilde, parámetro yexpansión variable, (…).
[man bash, resaltado agregado]

La expansión de llaves ocurre antes de que se expanda la variable y solo se puede ver {1..$user_input4}, lo que por supuesto no es válido.

Otro posible problema: si $user_input4resulta ser muy grande y por lo tanto obtienes unmuy largolista de nombres de directorio que puede excederARG_MAXel límite del caparazón, lo que hará que el comando falle. Puede utilizarlo seqpara crear la secuencia numérica, printfcrear una lista de argumentos delimitada por cero y xargsllamar mkdircon tanta frecuencia como sea necesario para solucionarlo. Por supuesto, también es seguro usarlo con una cantidad menor de argumentos, por lo que ese es el camino a seguir si estás tratando con un número desconocido y usuarios desagradables y viciosos:

printf 'Season%s\0' $(seq 1 $user_input4) | xargs -0 mkdir

Si desea que la secuencia numérica termine en $user_input4+ 1, simplemente reemplace la variable con la expresión aritmética $((user_input4 + 1)), por ejemplo:

printf 'Season%s\0' $(seq 1 $((user_input4 + 1))) | xargs -0 mkdir

Respuesta2

Que yo sepa, mkdir no acepta una variedad de directorios, al menos no en el formato en el que intenta usarlo. Estás creando las estaciones casi como una matriz. Pero tienes que pasarlos uno a la vez con espacios entre ellos si quieres crear más de un directorio con el comando mkdir.

Dado que está aceptando un valor numérico en user_input4, puede intentar realizar una cuenta regresiva desde el valor de user_input4 hasta llegar a cero usando un bucle while.

while [ $user_input4 -gt 0 ]
do
  mkdir Season${user_input4}
  let user_input4=${user_input4}-1
done

El bucle se detendrá naturalmente cuando user_input4 sea igual a cero. O si necesita uno más que el número, simplemente use -ge (mayor o igual a). El único inconveniente de este método es que creará los directorios en orden inverso. Entonces, si user_input4 es "3", entonces el orden sería:

mkdir Season3
mkdir Season2
mkdir Season1

información relacionada