Script Bash para criar uma estrutura de pastas

1

Estou tentando escrever um script Bash para automatizar uma tarefa recorrente, ou seja, a criação de uma estrutura de pastas, onde algumas delas devem ser numeradas (para ser mais específico, isso significa arquivar algumas séries de TV que eu foi convertido do DVD em uma estrutura de pastas facilmente compreensível pelo media player Kodi)

Uma primeira tentativa foi assim:

echo "Insert the title of the series"
read title

mkdir $title
mkdir $title/extrafanart
mkdir $title/themes
mkdir $title/videoextras

for num in {1..3}
do
  mkdir $title/"Season $num"
done

Isso cria corretamente a seguinte estrutura, no exemplo

Star Trek
Star Trek\extrafanart
Star Trek\Season 1
Star Trek\Season 2
Star Trek\Season 3
Star Trek\themes
Star Trek\videoextras

que é precisamente o que eu precisava. Mas, como você provavelmente pode ver, há uma grande desvantagem nesse script: o número total de pastas de temporada é fixo e não é escolhido dinamicamente toda vez que o script é executado. Então eu tentei modificá-lo da seguinte forma

echo "Insert the title of the series"
read title
echo "Insert the number of seasons"
read seasons

mkdir $title
mkdir $title/extrafanart
mkdir $title/themes
mkdir $title/videoextras

for num in {1..$seasons}
do
  mkdir $title/"Season $num"
done

Desta vez, o resultado não é exatamente o que eu esperava, é isso que recebo

Star Trek
Star Trek\extrafanart
Star Trek\Season {1..3}
Star Trek\themes
Star Trek\videoextras

que NÃO é o que eu preciso.

Eu acho que o problema está na primeira linha do for loop, onde a expansão da chave é lida pelo shell como uma string e não como uma expressão a ser avaliada. Estou certo?

O que está errado e como posso corrigir esse script?

    
por Sekhemty 29.08.2015 / 15:29

1 resposta

2

Use um loop:

num=1
while [ $num -le $seasons ]; do
  mkdir $title/"Season $num"
  num=$[ $num + 1 ]
done

Explicação

Estamos usando o [operador de teste e o operador $ [avaliação (eles são parecidos, mas são completamente diferentes). [ $num -le $seasons ] testa se $ num é L ess ou E qual de $ seasons; $[ $num + 1 ] adiciona um ao valor numérico de $ num e o atribui de volta a $ num.

Para obter informações sobre o operador de teste, digite help test em seu shell bash. O operador de avaliação é explicado no manual bash ( man bash , seja avisado, é longo). Você também pode usá-lo para subtrair, multiplicar, dividir, etc.

    
por 29.08.2015 / 15:34