¿Cómo crear subdirectorios inexistentes recursivamente usando Bash?

191

Estoy creando una secuencia de comandos de copia de seguridad rápida que volcará algunas bases de datos en una estructura de directorio agradable y ordenada y me di cuenta de que necesito probar para asegurarme de que los directorios existen antes de crearlos. El código que tengo funciona, pero parece que hay una mejor manera de hacerlo. ¿Alguna sugerencia?

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

Respuestas:

430

Puede usar el -pparámetro, que se documenta como :

-p, - padres

sin error si existe, haga directorios principales según sea necesario

Entonces:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
bmargulies
fuente
30
@bmargulies - Mierda que era mucho más simple de lo que pensaba = P
Topher Fangio
Votado porque eres un delecionista. ¡Vaya, ya lo hice hace aproximadamente un año!
Aaron Hall
No funciona si el usuario no tiene derecho a leer una de las carpetas intermitentes
TheKitMurkit
1
alias mkdirs=mkdir -p
dr jerry
67
$ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
Jonathan Feinberg
fuente
14

Si bien las respuestas existentes definitivamente resuelven el propósito, si está buscando replicar la estructura de directorios anidados en dos subdirectorios diferentes, puede hacerlo

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

Creará la siguiente estructura de directorios bajo el directorio desde donde se invoca

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

El ejemplo fue tomado de este enlace para crear la estructura de directorios SBT

y2k-shubham
fuente
9
Es posible que desee explicar qué {...,...}hay en bash y por qué tiene sentido lo que hace. Una breve explicación de la expansión de la llave sería beneficiosa para otros usuarios. Un "puedes hacer esto" y obtener "esto" deja un poco a la imaginación.
David C. Rankin
Estoy de acuerdo con @ DavidC.Rankin. Esta respuesta es perfecta en mi humilde opinión, pero necesita explicar qué hace realmente la notación de corchetes.
Delali
0
mkdir -p newDir/subdir{1..8}
ls newDir/
subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8
nitrohuffer2001
fuente
Esto solo creará 8 subdirectorios en newDir/.
csabinho