Forma automatizada de criar uma árvore de diretórios

11

Eu estou tentando fazer uma árvore de diretórios de A a Z, onde o próximo diretório está dentro do diretório atual.

Por exemplo: B está dentro de A e C está dentro de B e assim por diante.

-A
--B
---C
----...Z

Alguma pista sobre como fazer isso de maneira automatizada?

    
por Nish 10.04.2018 / 07:32

3 respostas

25

Com mkdir , printf e a expansão do suporte de bash:

$ mkdir -p "$(printf "%s/" {A..Z})"
$ tree A
A
└── B
    └── C
        └── D
            └── E
                └── F
                    └── G
                        └── H
                            └── I
                                └── J
                                    └── K
                                        └── L
                                            └── M
                                                └── N
                                                    └── O
                                                        └── P
                                                            └── Q
                                                                └── R
                                                                    └── S
                                                                        └── T
                                                                            └── U
                                                                                └── V
                                                                                    └── W
                                                                                        └── X
                                                                                            └── Y
                                                                                                └── Z

25 directories, 0 files
  • {A..Z} se expande para A B ... Z ,
  • printf "%s/" imprime os argumentos com um / depois deles, então eu recebo A/B/...Z/
  • e mkdir -p criam o diretório A/B/.../Z com qualquer diretório pai que precise criar.
por muru 10.04.2018 / 07:45
7

No nível muito simples, você pode usar a expansão {A..Z} para gerar toda a letra e, em seguida, criar e inserir iterativamente cada uma delas:

~/test_directory$ for d in {A..Z}; do mkdir "$d"; cd "$d"; done
~/test_directory/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z$ 

Como você pode ver no meu prompt de saída, agora você tem diretório completamente encadeado.

No entanto, se os nomes de diretórios reais forem diferentes do alfabeto, você terá que fornecer a lista de nomes de diretórios, talvez por meio de um arquivo, sobre os quais você fará a iteração e fará o mesmo processo novamente. Basicamente, isso

while IFS= read -r dir_name;do mkdir "$dir_name"; cd "$dir_name" ;done < directory_list.txt
    
por Sergiy Kolodyazhnyy 10.04.2018 / 07:42
2

Mesmo que o printf way do muru seja imbatível, eu pessoalmente gosto jot para esse tipo de coisa. jot não é instalado por padrão no Ubuntu. O pacote athena-jot fornece isso. Qualquer um desses comandos funciona:

mkdir -p "$(jot -s/ -c 26 A)"
jot -s/ -c 26 A | xargs mkdir -p

Realmente, qualquer comando que gere a sequência de letras e as une com barras facilitará isso, pois sua saída pode ser passada para mkdir -p por meio de command substitution (como em resposta de muru ) ou usando xargs . Aqui estão alguns exemplos usando algumas ferramentas e xargs que não exigem que você instale software, exceto talvez em sistemas muito mínimos ou no Ubuntu Core:

perl -we 'print join "/", A..Z' | xargs mkdir -p
ruby -we 'print (?A..?Z).to_a * ?/' | xargs mkdir -p
python3 -c 'print("/".join(__import__("string").ascii_uppercase))' | xargs mkdir -p

Versões antigas do Ubuntu vêm com o Python 2 em vez do Python 3. Para isso, basta alterar python3 para python para fazer o último comando funcionar, se você realmente quiser fazer isso com o Python.

Da mesma forma, a maneira simples e curta do muru pode, alternativamente, ser escrita:

printf '%s/' {A..Z} | xargs mkdir -p

O trailing / , no caminho do diretório mkdir -p é solicitado a criar, não é problema e, sem dúvida, é estilisticamente preferível. Mas é bom omiti-lo, como os outros exemplos nesta resposta.

    
por Eliah Kagan 11.04.2018 / 14:07