จะใช้ Bash เพื่อสร้างโฟลเดอร์ได้อย่างไรหากยังไม่มีอยู่?


180
#!/bin/bash
if [!-d /home/mlzboy/b2c2/shared/db]; then
    mkdir -p /home/mlzboy/b2c2/shared/db;
fi;

ดูเหมือนจะใช้งานไม่ได้ ใครช่วยได้บ้าง


4
ทำไมคุณมีเครื่องหมายอัฒภาค
ADTC

1
;โทเค็นเป็นตัวคั่นคำสั่งเพื่อให้เป็นบรรทัดใหม่ เนื่องจากthenเป็นคำสั่งแยกเซมิโคลอนก่อนหน้านี้จึงจำเป็นต้องสามารถเขียนในบรรทัดเดียวกัน อัฒภาคหลังจากmkdirและfiจะฟุ่มเฟือย
Andreas Riedmüller

คำตอบ:


279

ครั้งแรกในทุบตี "[" เป็นเพียงคำสั่งซึ่งคาดว่าสตริง "]" เป็นอาร์กิวเมนต์สุดท้ายดังนั้นช่องว่างก่อนที่จะปิดวงเล็บ (เช่นเดียวกับระหว่าง "!" และ "-d" ซึ่งจะต้องมีสองอาร์กิวเมนต์ที่แยกต่างหาก เหมือนกัน) ก็สำคัญ:

if [ ! -d /home/mlzboy/b2c2/shared/db ]; then
  mkdir -p /home/mlzboy/b2c2/shared/db;
fi

ข้อที่สองเนื่องจากคุณใช้สวิตช์ -p ไปmkdirการตรวจสอบนี้ไม่มีประโยชน์เพราะนี่คือสิ่งที่เกิดขึ้นตั้งแต่แรก แค่เขียน:

mkdir -p /home/mlzboy/b2c2/shared/db;

และนั่นมัน


2
หมายเหตุ: การ-pตั้งค่าสถานะทำให้ไดเรกทอรีหลักใด ๆ ถูกสร้างขึ้นถ้าจำเป็น
Danijel

13
พระเจ้าของฉันฉันไม่เคยรู้เลยว่า "[" เป็นคำสั่ง สิ่งนี้อธิบายถึงปัญหามากมายของฉัน ... สิ่งที่มีประโยชน์ที่สุดอย่างที่ฉันเคยอ่านใน
Ben Kushigian

1
ว้าว! การรู้ว่า "[" เป็นคำสั่งในการทุบตีนั้นช่างที่เปิดตา ฉันรู้สึกว่าปัญหามากมายกับสคริปต์ทุบตีของฉันได้รับการแก้ไขแล้ว!
raluru

93

ไม่จำเป็นต้องตรวจสอบว่ามีอยู่จริงหรือไม่ เนื่องจากคุณต้องการสร้างหากมีอยู่แล้วเพียง mkdir จะทำ

mkdir -p /home/mlzboy/b2c2/shared/db

2
หมายเหตุ: การ-pตั้งค่าสถานะทำให้ไดเรกทอรีหลักใด ๆ ถูกสร้างขึ้นถ้าจำเป็น
Danijel

67

เพียงทำ:

mkdir /path/to/your/potentially/existing/folder

mkdir จะโยนข้อผิดพลาดหากโฟลเดอร์มีอยู่แล้ว ในการเพิกเฉยต่อข้อผิดพลาดให้เขียน:

mkdir -p /path/to/your/potentially/existing/folder

ไม่จำเป็นต้องทำการตรวจสอบใด ๆ หรืออะไรอย่างนั้น


สำหรับการอ้างอิง:

-p, --parents no error if existing, make parent directories as needed http://man7.org/linux/man-pages/man1/mkdir.1.html


3
อาร์กิวเมนต์-pไม่ได้เพิกเฉยต่อข้อผิดพลาด: เรียกใช้โหมดที่แตกต่างกันซึ่งองค์ประกอบของเส้นทางที่ไม่มีอยู่จะถูกสร้างขึ้น (และดังนั้นจึงไม่ใช่ข้อผิดพลาดหากเกิดขึ้นที่จำเป็นต้องสร้างศูนย์) พฤติกรรมจะแตกต่างกันเนื่องจากจะสร้างส่วนประกอบอื่นนอกเหนือจากองค์ประกอบสุดท้ายซึ่งอาจเป็นที่ต้องการหรือไม่ต้องการ
BeeOnRope

23

คุณต้องการช่องว่างภายใน[และ]เครื่องหมายวงเล็บ:

#!/bin/bash
if [ ! -d /home/mlzboy/b2c2/shared/db ] 
then
    mkdir -p /home/mlzboy/b2c2/shared/db
fi

18

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

[ ! -d /home/mlzboy/b2c2/shared/db ] && mkdir -p /home/mlzboy/b2c2/shared/db

11
mmh ไม่ทำความสะอาด: สั้นลง เป็นการยากที่จะเข้าใจความหมายของคำแถลงดังกล่าวหากคุณเจอ
Davide Orazio Montersino

1
ฉันชอบสิ่งนี้แม้ว่า-pอาร์กิวเมนต์จะทำให้การตรวจสอบไม่จำเป็น คุณยังสามารถใช้งานได้เมื่อคุณไม่ต้องการใช้-pนั่นคือเมื่อคุณไม่ต้องการให้สร้างไดเรกทอรีหลักทั้งหมดโดยอัตโนมัติ
ADTC

3
จริงๆแล้วมันสั้นกว่าที่จะเขียน[ -d /path/to/dir ] || mkdir /path/to/dir.. ด้านขวาจะถูกดำเนินการเมื่อด้านซ้ายเป็นเท็จ
ADTC

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