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

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"

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


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


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

Esto solo creará 8 subdirectorios en newDir/.
csabinho
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.