Wie erstelle ich nicht vorhandene Unterverzeichnisse rekursiv mit Bash?

191

Ich erstelle ein schnelles Sicherungsskript, das einige Datenbanken in eine nette / ordentliche Verzeichnisstruktur kopiert, und mir wurde klar, dass ich testen muss, um sicherzustellen, dass die Verzeichnisse vorhanden sind, bevor ich sie erstelle. Der Code, den ich habe, funktioniert, aber es scheint, dass es einen besseren Weg gibt, dies zu tun. Irgendwelche Vorschläge?

[ -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"
Topher Fangio
quelle
3
unix.stackexchange.com/questions/49263/recursive-mkdir
Ciro Santilli 法轮功 冠状 病 六四.

Antworten:

430

Sie können den -pParameter verwenden, der wie folgt dokumentiert ist :

-p, - Eltern

Kein Fehler, falls vorhanden. Erstellen Sie nach Bedarf übergeordnete Verzeichnisse

So:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
bmargulies
quelle
30
@bmargulies - Heiliger Mist, der viel einfacher war als ich dachte = P
Topher Fangio
Upvoted, weil Sie ein Deletionist sind. Hoppla, schon vor ungefähr einem Jahr!
Aaron Hall
Es funktioniert nicht, wenn der Benutzer kein Recht hat, einen der intermittierenden Ordner zu lesen
TheKitMurkit
1
alias mkdirs=mkdir -p
Dr. Jerry
67
$ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
Jonathan Feinberg
quelle
14

Während vorhandene Antworten definitiv den Zweck lösen, können Sie dies tun, wenn Sie eine verschachtelte Verzeichnisstruktur unter zwei verschiedenen Unterverzeichnissen replizieren möchten

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

Es wird die folgende Verzeichnisstruktur unter dem Verzeichnis erstellt, von dem aus es aufgerufen wird

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

Das Beispiel wurde diesem Link zum Erstellen der SBT-Verzeichnisstruktur entnommen

y2k-shubham
quelle
9
Vielleicht möchten Sie erklären, was {...,...}in Bash ist und warum das, was Sie tun, Sinn macht. Eine kurze Erklärung der Klammererweiterung wäre für andere Benutzer von Vorteil. Ein "Sie können dies tun" und "dies" erhalten ein wenig der Fantasie überlassen.
David C. Rankin
Ich stimme @ DavidC.Rankin zu. Diese Antwort ist meiner Meinung nach perfekt, muss aber erklärt werden, was die Klammernotation tatsächlich bewirkt.
Delali
0
mkdir -p newDir/subdir{1..8}
ls newDir/
subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8
nitrohuffer2001
quelle
Dadurch werden nur 8 Unterverzeichnisse in erstellt newDir/.
Csabinho