วิธีสร้างไดเรกทอรีย่อยที่ไม่มีอยู่ซ้ำโดยใช้ Bash


191

ฉันกำลังสร้างสคริปต์สำรองอย่างรวดเร็วที่จะถ่ายโอนฐานข้อมูลบางส่วนไปยังโครงสร้างไดเรกทอรีที่ดี / เรียบร้อยและฉันรู้ว่าฉันต้องทดสอบเพื่อให้แน่ใจว่าไดเรกทอรีมีอยู่ก่อนที่ฉันจะสร้างพวกเขา รหัสที่ฉันใช้งานได้ แต่ดูเหมือนว่ามีวิธีที่ดีกว่าที่จะทำ ข้อเสนอแนะใด ๆ

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

คำตอบ:


431

คุณสามารถใช้-pพารามิเตอร์ซึ่งบันทึกเป็น :

-p, --parents

ไม่มีข้อผิดพลาดถ้ามีอยู่ให้สร้างไดเรกทอรีหลักตามต้องการ

ดังนั้น:

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

30
@bmargulies - อึศักดิ์สิทธิ์ที่เป็นวิธีที่ง่ายกว่าที่ฉันคิด = P
Topher Fangio

โหวตขึ้นเพราะคุณเป็นนักลบ อ๊ะทำไปเมื่อประมาณหนึ่งปีที่แล้ว!
Aaron Hall

ไม่สามารถใช้งานได้หากผู้ใช้ไม่มีสิทธิ์อ่านหนึ่งในโฟลเดอร์ต่อเนื่อง
TheKitMurkit

1
alias mkdirs=mkdir -p
dr jerry


14

ในขณะที่คำตอบที่มีอยู่ตอบวัตถุประสงค์ได้อย่างแน่นอนหากคุณต้องการจำลองโครงสร้างไดเรกทอรีที่ซ้อนกันภายใต้ไดเรกทอรีย่อยสองแห่งคุณสามารถทำสิ่งนี้ได้

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

มันจะสร้างโครงสร้างไดเรกทอรีต่อไปนี้ภายใต้ไดเรกทอรีจากที่มันถูกเรียก

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

ตัวอย่างนี้นำมาจากลิงก์นี้เพื่อสร้างโครงสร้างไดเรกทอรี SBT


9
คุณอาจต้องการอธิบายสิ่งที่{...,...}อยู่ในการทุบตีและทำไมสิ่งที่คุณทำมีเหตุผล คำอธิบายสั้น ๆ ของการขยายรั้งจะเป็นประโยชน์กับผู้ใช้รายอื่น "คุณสามารถทำสิ่งนี้" และรับ "สิ่งนี้" ออกไปจากจินตนาการ
David C. Rankin

ฉันเห็นด้วยกับ @ DavidC.Rankin คำตอบนี้เป็น IMHO ที่สมบูรณ์แบบ แต่ต้องอธิบายว่าเครื่องหมายวงเล็บทำอะไรได้บ้าง
Delali

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

เพียงแค่นี้ก็จะสร้าง 8 newDir/ไดเรกทอรีย่อยใน
csabinho
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.