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"

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"

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


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


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

Dadurch werden nur 8 Unterverzeichnisse in erstellt newDir/.
Csabinho
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.