Modo automatizzato per creare un albero di directory


11

Sto cercando di creare un albero di directory dalla A alla Z in cui la directory successiva si trova all'interno della directory corrente.

Ad esempio: B è all'interno di A e C è all'interno di B e così via ..

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

Qualche indizio su come farlo in modo automatizzato?


Mi chiedo quale sia lo scopo pratico di tali directory. IMHO questa sembra più una domanda per Code Golf .
Melebio

3
@Melebius Uno scopo possibile è quello di creare una struttura di directory come test case, al fine di verificare che qualche altro comando, script o proprietà dell'applicazione funzioni. Ecco un esempio recente in cui la domanda in sé non riguardava la creazione di strutture di directory specifiche, ma sapere come scrivere i comandi per farlo era utile a scopo di test, non a dispetto di come la struttura specifica fosse inventata e strana, ma a causa di essa. (Abbiamo anche molte domande sulla creazione di strutture di directory specifiche, che si possono trovare cercando " mkdir -p".)
Eliah Kagan

Risposte:


25

Con mkdir, printfe l'espansione parentesi 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}si espande a A B ... Z,
  • printf "%s/"stampa gli argomenti con un /dopo di loro, quindi capiscoA/B/...Z/
  • e mkdir -pcrea la A/B/.../Zdirectory con tutte le directory principali che dovevano essere create.

grazie per quello. Pensavo di avere questo errore mentre. Uso il 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: nessun file o directory di questo tipo
Nish

3
@Nish C'è una -pnel mkdircomando.
muru,

mio male, l'ho provato sul mio mac anziché su Ubuntu. E una domanda di follow-up è questa -> diciamo che volevo avere la directory A1..A100 all'interno di A (nella stessa struttura AtoZ). Poi B1..B100 in B. Quindi sembra qualcosa del genere -> imgur.com/jfuKEdf
Nish

11
Supponiamo che pubblichi un follow-up come una domanda effettiva anziché nei commenti e non abbia utilizzato immagini ma testo. Sarebbe molto meglio, no?
muru,

Capisco il tuo punto qui. È difficile pubblicarlo come non un codice ed è un output di hugeass. Quindi semplicemente guardare lo screenshot rende più facile la comprensione.
Nish,

7

A un livello molto semplice, è possibile utilizzare l' {A..Z}espansione per generare tutta la lettera, quindi creare e inserire ripetutamente ciascuno:

~/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$ 

Come puoi vedere nel mio prompt di output, ora hai la directory completamente incatenata.

Tuttavia, se i nomi di directory effettivi sono diversi rispetto al solo alfabeto, dovrai in qualche modo fornire l'elenco dei nomi di directory, magari tramite un file, su cui esegui l'iterazione e ripeti lo stesso processo. Fondamentalmente, questo

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

è piuttosto bello. Ecco una domanda di follow-up. diciamo che volevo avere la directory A1..A100 all'interno di A (nella stessa struttura AtoZ). Quindi B1..B100 all'interno di B. Quindi sembra qualcosa del genere -> imgur.com/jfuKEdf
Nish

@Nish ah, che richiederebbe un ciclo interno cosìfor d in {A..Z}; do mkdir "$d"; cd "$d"; for i in {1..100}; do mkdir "${d}${i}" ;done ; done
Sergiy Kolodyazhnyy

O anche senza anello interno,for d in {A..Z}; do mkdir "$d"; cd "$d"; mkdir "$d"{1..100}; done
Sergiy Kolodyazhnyy,

grazie per quello. Sembra funzionare ma l'ordine della directory sembra rovinato, quindi 2 non è dopo 1. È ordinato casualmente. In ogni caso per risolvere questo? Ecco uno screenshot -> imgur.com/a/Zqj1c
Nish

@Nish L'ordinamento è basato su testo, non numerico come penso che ti aspetti. Per quanto riguarda tree, non sono sicuro di come risolverlo, ma penso che questo potrebbe non essere nemmeno un treeproblema, ma piuttosto l'ordinamento della shell. Suggerirei di fare una domanda reale a riguardo o qui o meglio ancora su unix.stackexchange.com
Sergiy Kolodyazhnyy,

2

Anche se di Muru printfmodo non può essere battuto, io personalmente come jotper questo genere di cose. jotnon è installato di default in Ubuntu. Il athena-jotpacchetto lo fornisce. Uno di questi comandi funziona:

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

In realtà qualsiasi comando che generi la sequenza di lettere e le unisca con delle barre faciliterà ciò, perché il suo output può essere passato mkdir -po tramite la sostituzione del comando (come nella risposta di Muru ) o usando xargs. Ecco alcuni esempi che utilizzano alcuni strumenti e xargsche non richiedono l'installazione di software, tranne forse su sistemi molto minimali o 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

Vecchio versioni di Ubuntu sono dotati di Python 2 invece di Python 3. Per questo, basta cambiare python3a pythonfare quel ultima opera di comando, se si vuole veramente fare questo con Python.

Allo stesso modo, il modo breve e semplice di Muru può in alternativa essere scritto:

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

Il trailing /, nel percorso della directory che mkdir -pviene richiesto di creare, non è un problema ed è probabilmente stilisticamente preferibile. Ma va bene ometterlo, come fanno gli altri esempi in questa risposta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.