Emitir com o script Bash criando diretórios de matrizes

3

Problema em mãos

Estou tentando escrever um script bash para criar rapidamente uma estrutura de diretórios. Esta é uma tentativa de aprender mais sobre a manipulação de matrizes, variáveis e usando loops. Meu script funciona para verificar a existência de um diretório e criar pastas. O problema que estou tendo é criar um terceiro nível de diretórios nas duas primeiras camadas.

Objetivos

Eu quero poder escrever um script bash que criará uma estrutura de diretório de ~/a/a/a, ~/a/a/b, ~/a/a/c,...,~/a/z/z por exemplo. Isso deve ser flexível para que eu possa usar qualquer tipo de matriz ou variável que seja adequada.

Aqui está o que eu tenho trabalhado até agora:

#!/bin/bash
array_0=(one two three four five)
array_1=(x y z)

if [ ! -d "directory" ]; then
    mkdir directory
fi
for array_0 in "${array_0[@]}"
do
    mkdir ~/directory/$array_0/
done
if [ -d "~/directory/$array_0/" ]; then
   for array_1 in "${array_0[@]}"
   do
       mkdir ~/directory/$array_0/$array_1
   done
fi
exit 0

Problema

O erro que recebo é mkdir: cannot create directory '/home/user/directory/one/x' : No such file or directory

Outras tentativas neste script permitem-me criar ~/directory e ~/directory/one, ~/directory/two,..., ~/directory/five sem falhas, mas não o próximo nível, ou seja, /directory/one/x e etc.

Como posso criar scripts para a criação dessa estrutura de diretórios? Isso é possível usando matrizes ou existe outro método?

Para referência, tentei implementar esta postagem e elementos de este post mas eu não tive sorte em criar a estrutura de diretório que eu quero.

    
por kemotep 26.02.2018 / 21:32

1 resposta

2

Você poderia usar um loop de matriz aninhado, como este

#!/bin/bash
array_0=(one two three four five)
array_1=(x y z)

for a0 in "${array_0[@]}"
do
   for a1 in "${array_1[@]}"
   do
       mkdir -p "$HOME/web/$a0/$a1"
   done
done

Ou, se você não se importar em evitar o uso de matrizes, mas usar listas de expansão, esse único comando fará praticamente a mesma coisa:

mkdir -p ~/{one,two,three,four,five}/{x,y,z}
    
por 26.02.2018 / 21:38