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"

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"

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


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


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

Ini hanya akan membuat 8 sub-direktori di newDir/.
csabinho
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.