Come creare sottodirectory inesistenti ricorsivamente usando Bash?


191

Sto creando uno script di backup rapido che scaricherà alcuni database in una struttura di directory piacevole / ordinata e mi sono reso conto che devo testare per accertarmi che le directory esistano prima di crearle. Il codice che ho funziona, ma sembra che ci sia un modo migliore per farlo. Eventuali suggerimenti?

[ -d "$BACKUP_DIR" ] || mkdir "$BACKUP_DIR"
[ -d "$BACKUP_DIR/$client" ] || mkdir "$BACKUP_DIR/$client"
[ -d "$BACKUP_DIR/$client/$year" ] || mkdir "$BACKUP_DIR/$client/$year"
[ -d "$BACKUP_DIR/$client/$year/$month" ] || mkdir "$BACKUP_DIR/$client/$year/$month"
[ -d "$BACKUP_DIR/$client/$year/$month/$day" ] || mkdir "$BACKUP_DIR/$client/$year/$month/$day"

Risposte:


431

È possibile utilizzare il -pparametro, che è documentato come :

-p, --parents

nessun errore, se esistente, crea le directory principali secondo necessità

Così:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"

30
@bmargulies - Merda sacra che era molto più semplice di quanto pensassi = P
Topher Fangio

È stato votato perché sei un cancellatore. Oops, già fatto circa un anno fa!
Aaron Hall

Non funziona se l'utente non ha il diritto di leggere una delle cartelle intermittenti
TheKitMurkit

1
alias mkdirs=mkdir -p
dr jerry,


14

Mentre le risposte esistenti risolvono sicuramente lo scopo, se stai cercando di replicare la struttura di directory nidificata in due diverse sottodirectory, puoi farlo

mkdir -p {main,test}/{resources,scala/com/company}

Creerà la seguente struttura di directory nella directory da cui viene invocata

├── main
   ├── resources
   └── scala
       └── com
           └── company
└── test
    ├── resources
    └── scala
        └── com
            └── company

L'esempio è stato preso da questo link per la creazione della struttura di directory SBT


9
Potresti voler spiegare cosa {...,...}c'è in bash e perché ciò che ha senso ha senso. Una breve spiegazione dell'espansione del tutore sarebbe vantaggiosa per gli altri utenti. Un "puoi farlo" e ottenere "questo" lascia un po 'all'immaginazione.
David C. Rankin il

Sono d'accordo con @ DavidC.Rankin. Questa risposta è IMHO perfetta, ma deve spiegare cosa fa effettivamente la notazione tra parentesi.
Delali,

0
mkdir -p newDir/subdir{1..8}
ls newDir/
subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8

Questo creerà solo 8 sottodirectory in newDir/.
csabinho,
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.