Làm thế nào để tạo các thư mục con không tồn tại đệ quy bằng Bash?


191

Tôi đang tạo một kịch bản sao lưu nhanh sẽ kết xuất một số cơ sở dữ liệu vào một cấu trúc thư mục đẹp / gọn gàng và tôi nhận ra rằng tôi cần phải kiểm tra để đảm bảo rằng các thư mục tồn tại trước khi tôi tạo chúng. Mã tôi đã làm việc, nhưng có vẻ như có một cách tốt hơn để làm điều đó. Bất kỳ đề xuất?

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

Câu trả lời:


430

Bạn có thể sử dụng -ptham số, được ghi lại dưới dạng :

-p, -

không có lỗi nếu có, tạo thư mục mẹ khi cần

Vì thế:

mkdir -p "$BACKUP_DIR/$client/$year/$month/$day"

30
@bmargulies - Holy crap đơn giản hơn tôi nghĩ = P
Topher Fangio

Nâng cao vì bạn là người xóa. Rất tiếc, đã làm khoảng một năm trước!
Aaron Hall

Nó không hoạt động nếu người dùng không có quyền đọc một trong các thư mục không liên tục
TheKitMurkit

1
alias mkdirs=mkdir -p
dr jerry


14

Mặc dù các câu trả lời hiện có chắc chắn giải quyết được mục đích, nhưng nếu bạn đang muốn sao chép cấu trúc thư mục lồng nhau dưới hai thư mục con khác nhau, thì bạn có thể làm điều này

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

Nó sẽ tạo cấu trúc thư mục theo thư mục từ nơi nó được gọi

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

Ví dụ được lấy từ liên kết này để tạo cấu trúc thư mục SBT


9
Bạn có thể muốn giải thích những gì {...,...}trong bash và tại sao những gì bạn làm có ý nghĩa. Một lời giải thích ngắn về việc mở rộng niềng răng sẽ có lợi cho những người dùng khác. Một "bạn có thể làm điều này" và nhận được "điều này" để lại một chút cho trí tưởng tượng.
David C. Rankin

Tôi đồng ý với @ DavidC.Rankin. Câu trả lời này là IMHO hoàn hảo, nhưng nó cần giải thích những gì ký hiệu khung thực sự làm.
Delali

0
mkdir -p newDir/subdir{1..8}
ls newDir/
subdir1 subdir2 subdir3 subdir4 subdir5 subdir6 subdir7 subdir8

Điều này sẽ chỉ tạo 8 thư mục con trong newDir/.
csabinho
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.