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"

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"

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


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


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

Spowoduje to po prostu utworzenie 8 podkatalogów w newDir/.
csabinho
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.