Script de criação de diretório e subdiretório com base na entrada do usuário

Script de criação de diretório e subdiretório com base na entrada do usuário

Olá, apenas um amador novato aqui, então espero que esta não seja uma pergunta muito simples.

Estou tentando escrever um script que me permita gerar toda a estrutura de arquivos da minha mídia usando apenas entradas do usuário. Tenho tudo funcionando, exceto a linha 20, onde reside o 'mkdir Season{1..$user_input4}. Eu gostaria que ele pegasse o usuário input_4 e criasse 1 + esse número de diretórios, mas sinto que posso estar olhando isso da perspectiva errada, pois em vez disso ele cria um subdiretório chamado Season{1..(imprime a entrada do usuário)}.

#!/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

Se alguém tiver alguma idéia, seria muito apreciada. Obrigado!

Responder1

Não funciona assim porque:

A ordem das expansões é:expansão de cinta; expansão de til, parâmetro eexpansão variável, (…).
[man bash, destaque adicionado]

A expansão de chaves acontece antes da variável ser expandida e só pode ser vista {1..$user_input4}, o que obviamente não é válido.

Outro possível problema: se $user_input4acontecer de ele ser muito grande e você conseguir ummuito longolista de nomes de diretório que você pode excederARG_MAXo limite do shell, o que fará com que o comando falhe. Você pode usar seqpara criar a sequência numérica, printfpara criar uma lista de argumentos delimitados por zero e xargspara chamar mkdirquantas vezes for necessário para contornar isso. É claro que também é seguro usar com um número menor de argumentos, então esse é o caminho a seguir se você estiver lidando com um número desconhecido e com usuários desagradáveis ​​e cruéis:

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

Se quiser que a sequência numérica termine em $user_input4+1, basta substituir a variável pela expressão aritmética $((user_input4 + 1)), ex.:

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

Responder2

Que eu saiba, o mkdir não aceita uma variedade de diretórios, pelo menos não no formato que você está tentando usar. Você está criando as estações quase como uma matriz. Mas você deve passá-los um de cada vez com espaços entre eles se quiser criar mais de um diretório com o comando mkdir.

Como você está aceitando um valor numérico em user_input4, você pode tentar fazer uma contagem regressiva a partir do valor de user_input4 até chegar a zero usando um loop while.

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

O loop irá parar naturalmente quando user_input4 for igual a zero. Ou se você precisar de um a mais que o número, basta usar -ge (maior ou igual a). O único problema desse método é que ele criará os diretórios na ordem inversa. Portanto, se user_input4 for "3", a ordem seria:

mkdir Season3
mkdir Season2
mkdir Season1

informação relacionada