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"
Topher Fangio
la source
3
unix.stackexchange.com/questions/49263/recursive-mkdir
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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"
bmargulies
la source
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
67
$ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
Jonathan Feinberg
la source
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

y2k-shubham
la source
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
nitrohuffer2001
la source
Cela créera simplement 8 sous-répertoires dans newDir/.
csabinho