Bagaimana cara membuat subdirektori yang tidak ada secara rekursif menggunakan Bash?

191

Saya membuat skrip cadangan cepat yang akan membuang beberapa database ke dalam struktur direktori yang bagus / rapi dan saya menyadari bahwa saya perlu menguji untuk memastikan bahwa direktori ada sebelum saya membuatnya. Kode yang saya miliki berfungsi, tetapi tampaknya ada cara yang lebih baik untuk melakukannya. Ada saran?

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

Jawaban:

431

Anda dapat menggunakan -pparameter, yang didokumentasikan sebagai :

-p, --orang tua

jika ada kesalahan, buat direktori induk sesuai kebutuhan

Begitu:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
bmargulies
sumber
30
@ Bmargulies - Omong kosong yang jauh lebih sederhana daripada yang saya kira = P
Topher Fangio
Terpilih karena Anda seorang deletionis. Ups, sudah sekitar setahun yang lalu!
Aaron Hall
Ini tidak berfungsi jika pengguna tidak memiliki hak untuk membaca salah satu folder berselang
TheKitMurkit
1
alias mkdirs=mkdir -p
dr jerry
67
$ mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"
Jonathan Feinberg
sumber
14

Sementara jawaban yang ada pasti memecahkan tujuan, jika Anda ingin mereplikasi struktur direktori bersarang di bawah dua subdirektori yang berbeda, maka Anda dapat melakukan ini

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

Ini akan membuat struktur direktori berikut di bawah direktori dari mana ia dipanggil

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

Contoh diambil dari tautan ini untuk membuat struktur direktori SBT

y2k-shubham
sumber
9
Anda mungkin ingin menjelaskan apa yang {...,...}ada di bash dan mengapa apa yang Anda lakukan masuk akal. Penjelasan singkat tentang ekspansi brace akan bermanfaat bagi pengguna lain. "Anda bisa melakukan ini" dan "ini" meninggalkan imajinasi Anda.
David C. Rankin
Saya setuju dengan @ DavidC.Rankin. Jawaban ini adalah IMHO sempurna, tetapi perlu menjelaskan apa yang sebenarnya dilakukan notasi braket.
Delali
0
mkdir -p newDir/subdir{1..8}
ls newDir/
subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8
nitrohuffer2001
sumber
Ini hanya akan membuat 8 sub-direktori di newDir/.
csabinho