O problema é que você não está criando uma matriz, você está criando uma string. Você pode testar isso facilmente, tentando imprimir o primeiro elemento da sua matriz:
$ array="$(find . -maxdepth 2 -type d -iname 'Season*' -print)";
$ echo $array
./Season 3 ./Season 1 ./Season 2
Parece bom né? Mas se isso fosse uma matriz, você seria capaz de imprimir cada elemento separadamente. Infelizmente, o acima é uma string simples 1 e não uma matriz:
$ echo ${array[0]}
./Season 3 ./Season 1 ./Season 2
$ echo ${array[1]}
A matriz na verdade consiste em uma única string, e é por isso que o segundo elemento da "matriz" ( ${array[1]}
) está vazio. Em qualquer caso, você não precisa de um array para isso, basta ler a saída de find
(você também não precisa do -print
, é o que faz por padrão). Uma versão funcional do seu script pode ser:
#!/usr/bin/env bash
find . -maxdepth 2 -type d -iname 'Season*' | sort -r |
while IFS= read -r dir
do
mv "$dir" ${dir/Season /Sn} && echo Changed "$dir" to "$dir/Season /Sn}";
done
Existem alguns truques usados aqui. Primeiro, o loop while
para percorrer os resultados de find
. Esse é o mesmo princípio básico que o loop for
que você usou, mas combinado com read
pode ler da entrada padrão.
O IFS=
é necessário para evitar a divisão no espaço em branco (sem ele, o diretório Season 1
seria dividido em Season
e 1
).
O -r
de read diz para não permitir que as barras invertidas escapem de caracteres (coisas como \t
e \n
são tratadas literalmente), o que garante que isso possa lidar até com os nomes mais estranhos.
O sort -r
é necessário para que, se você tiver um diretório correspondente ao padrão dentro de outro diretório correspondente, o filho seja listado antes do pai. Por exemplo:
./Season 12/Season 13
./Season 12
Isso garante que você execute mv "Season 12" "Sn12"
após executando mv "Season 12"/"Season 13" "Season 12"/"Sn13"
. Se você não fizer isso, o segundo comando falhará, pois Season 12
não existe mais.
Por fim, removi o sudo
. Você deve executar o script como sudo script.sh
. Nunca é uma boa ideia ter aleatórias sudo
chamadas em seus scripts.
1 Não tenho certeza sobre os detalhes, mas, aparentemente, o bash trata variáveis de string como matrizes de um elemento.