Jak rekurencyjnie utworzyć nieistniejące podkatalogi za pomocą Bash?

198

Tworzę skrypt szybkiego tworzenia kopii zapasowych, który zrzuci niektóre bazy danych do ładnej / schludnej struktury katalogów i zdałem sobie sprawę, że muszę przetestować, aby upewnić się, że katalogi istnieją, zanim je utworzę. Kod, który mam, działa, ale wydaje się, że jest na to lepszy sposób. Jakieś sugestie?

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

Odpowiedzi:

442

Możesz użyć -pparametru, który jest udokumentowany jako :

-p, --parents

brak błędu, jeśli istnieje, w razie potrzeby utwórz katalogi nadrzędne

Więc:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
bmargulies
źródło
32
@bmargulies - Cholera, to było o wiele prostsze niż myślałem = P
Topher Fangio
Głos za pozytywnymi, ponieważ jesteś delecjalistą. Ups, już około rok temu!
Aaron Hall
To nie działa, jeśli użytkownik nie ma prawa do czytania jednego z sporadycznych folderów
TheKitMurkit Kwietnia
3
alias mkdirs=mkdir -p
dr jerry
67
$ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
Jonathan Feinberg
źródło
15

Chociaż istniejące odpowiedzi zdecydowanie rozwiązują cel, jeśli chcesz powielić zagnieżdżoną strukturę katalogów w dwóch różnych podkatalogach, możesz to zrobić

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

Utworzy następującą strukturę katalogów w katalogu, z którego jest wywoływana

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

Przykład został wzięty z tego linku do tworzenia struktury katalogów SBT

y2k-shubham
źródło
9
Możesz chcieć wyjaśnić, co {...,...}jest w bash i dlaczego to, co robisz, ma sens. Krótkie wyjaśnienie rozszerzenia nawiasów byłoby korzystne dla innych użytkowników. „Możesz to zrobić” i zdobyć „to” pozostawia trochę wyobraźni.
David C. Rankin,
Zgadzam się z @ DavidC.Rankin. Ta odpowiedź jest idealna IMHO, ale wymaga wyjaśnienia, co tak naprawdę robi notacja nawiasów.
Delali
0
mkdir -p newDir/subdir{1..8}
ls newDir/
subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8
nitrohuffer2001
źródło
Spowoduje to po prostu utworzenie 8 podkatalogów w newDir/.
csabinho