Comment créer des sous-répertoires inexistants de manière récursive en utilisant Bash?


191

Je crée un script de sauvegarde rapide qui videra certaines bases de données dans une structure de répertoires agréable / soignée et j'ai réalisé que je devais tester pour m'assurer que les répertoires existent avant de les créer. Le code que j'ai fonctionne, mais il semble qu'il existe une meilleure façon de le faire. Aucune suggestion?

[ -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"

Réponses:


431

Vous pouvez utiliser le -pparamètre, qui est documenté comme :

-p, --parents

pas d'erreur s'il existe, créez des répertoires parents si nécessaire

Alors:

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

30
@bmargulies - Putain de merde qui était bien plus simple que je ne le pensais = P
Topher Fangio

J'ai voté pour parce que vous êtes un suppresseur. Oups, déjà fait il y a environ un an!
Aaron Hall

Cela ne fonctionne pas si l'utilisateur n'a pas le droit de lire l'un des dossiers intermittents
TheKitMurkit

2
alias mkdirs=mkdir -p
dr jerry


14

Bien que les réponses existantes résolvent définitivement le but, si vous cherchez à répliquer la structure de répertoires imbriqués sous deux sous-répertoires différents, vous pouvez le faire

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

Il créera la structure de répertoires suivante sous le répertoire à partir duquel il est appelé

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

L'exemple est tiré de ce lien pour créer une structure de répertoires SBT


9
Vous voudrez peut-être expliquer ce qu'il {...,...}y a dans bash et pourquoi ce que vous faites a du sens. Une brève explication de l' expansion des accolades serait bénéfique pour les autres utilisateurs. Un "vous pouvez faire ceci" et obtenir "ceci" laisse un peu à l'imagination.
David C. Rankin

Je suis d'accord avec @ DavidC.Rankin. Cette réponse est parfaite à mon humble avis, mais elle doit expliquer ce que fait réellement la notation entre parenthèses.
Delali

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

Cela créera simplement 8 sous-répertoires dans newDir/.
csabinho
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.