Maneira automatizada de criar uma árvore de diretórios


11

Estou tentando criar 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 fazê-lo da maneira automatizada?


Gostaria de saber qual é o objetivo prático de tais diretórios. IMHO isso parece mais uma pergunta para o Code Golf .
Melebius

3
@Melebius Um objetivo possível é criar uma estrutura de diretórios como um caso de teste, para ajudar a verificar se algum outro comando, script ou aplicativo funciona. Aqui está um exemplo recente em que a pergunta em si não era sobre a criação de estruturas de diretório específicas, mas saber como escrever comandos para fazer isso era útil para fins de teste, não apesar de como a estrutura específica era artificial e estranha, mas por causa disso. (Nós também temos muitas perguntas sobre a criação de estruturas de diretórios específicos, que podem ser encontrados através da procura de " mkdir -p".)
Elias Kagan

Respostas:


25

Com mkdir, printfe expansão cinta do 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}expande para A B ... Z,
  • printf "%s/"imprime os argumentos com um /depois deles, então eu receboA/B/...Z/
  • e mkdir -pcria o A/B/.../Zdiretório com os diretórios pai que precisavam ser criados.

obrigado por isso. Pensei que eu recebesse esse erro enquanto. Eu uso o comando mkdir: 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: Não
existe

3
@ Nish Há um -pno mkdircomando.
Muru

meu mal, eu tentei isso no meu mac, em vez de ubuntu. E uma pergunta de acompanhamento é esta -> digamos que eu queria ter o diretório A1..A100 dentro de A (na mesma estrutura AtoZ). Então B1..B100 dentro de B. Portanto, é algo parecido com isto -> imgur.com/jfuKEdf
Nish

11
Digamos que você publique um acompanhamento como uma pergunta real, em vez de nos comentários, e não usou imagens, mas texto. Isso seria muito melhor, não?
Muru

Eu entendo o seu ponto aqui. É difícil publicá-lo, pois não é um código e é uma saída imensurável. Então, basta olhar para a captura de tela para facilitar a compreensão.
Nish

7

No nível muito simples, você pode usar a {A..Z}expansão 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 na minha saída imediata, agora você tem um diretório completamente encadeado.

No entanto, se os nomes dos diretórios reais forem diferentes do que apenas o alfabeto, você precisará fornecer, de alguma forma, a lista de nomes de diretórios, talvez por meio de um arquivo, sobre o qual você itera e executa o mesmo processo novamente. Basicamente, isso

while IFS= read -r dir_name;do mkdir "$dir_name"; cd "$dir_name" ;done < directory_list.txt

Isso é bem legal. Aqui está uma pergunta de acompanhamento. digamos que eu queria ter o diretório A1..A100 dentro de A (na mesma estrutura AtoZ). Então B1..B100 dentro de B. Portanto, parece algo como isto -> imgur.com/jfuKEdf
Nish

@Nish ah, que iria exigir um loop interno de modofor d in {A..Z}; do mkdir "$d"; cd "$d"; for i in {1..100}; do mkdir "${d}${i}" ;done ; done
Sergiy Kolodyazhnyy

Ou mesmo sem loop interno,for d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Sergiy Kolodyazhnyy

obrigado por isso. Parece funcionar, mas a ordem do diretório parece errada, então 2 não está depois de 1. É ordenado aleatoriamente. Enfim, para consertar isso? Aqui está uma captura de tela -> imgur.com/a/Zqj1c
Nish

A ordem de classificação @Nish é baseada em texto, não numérica, como eu acho que você espera. Até o momento tree, não tenho certeza de como consertar isso, mas acho que isso pode até não ser treeo problema, mas a ordem de classificação do shell. Eu sugiro que faz a pergunta real sobre isso aqui ou melhor ainda em unix.stackexchange.com
Sergiy Kolodyazhnyy

2

Embora o printfcaminho do muru não possa ser batido, eu pessoalmente gosto jotdesse tipo de coisa. jotnão está instalado por padrão no Ubuntu. O athena-jotpacote fornece. Um destes 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 junte a barras facilitará isso, porque sua saída pode ser passada para mkdir -pa substituição de comandos (como na resposta de muru ) ou usando xargs. Aqui estão alguns exemplos usando algumas ferramentas e xargsque não exigem a instalação de 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

As versões antigas do Ubuntu vêm com o Python 2, em vez do Python 3. Para isso, basta alterar python3para pythonque o último comando funcione, se você realmente quiser fazer isso com o Python.

Da mesma forma, a maneira curta e simples de muru pode ser escrita como alternativa:

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.