จะ mkdir ได้อย่างไรถ้าไม่มี dir อยู่?


1987

ฉันกำลังเขียนเชลล์สคริปต์ให้ทำงานภายใต้ KornShell (ksh) บน AIX ฉันต้องการใช้mkdirคำสั่งเพื่อสร้างไดเรกทอรี แต่ไดเรกทอรีอาจมีอยู่แล้วในกรณีนี้ฉันไม่ต้องการทำอะไรเลย ดังนั้นฉันจึงต้องการทดสอบเพื่อดูว่าไม่มีไดเรกทอรีหรือระงับข้อผิดพลาด "มีไฟล์" ที่ผิดพลาดmkdirเมื่อพยายามสร้างไดเรกทอรีที่มีอยู่

มีความคิดเห็นเกี่ยวกับวิธีการที่ดีที่สุดในการทำเช่นนี้?

คำตอบ:


3294

ลองmkdir -p:

mkdir -p foo

โปรดทราบว่านี่จะสร้างไดเรกทอรีระดับกลางที่ไม่มีอยู่ด้วย เช่น

mkdir -p foo/bar/baz

จะสร้างไดเรกทอรีfoo, foo/barและfoo/bar/bazถ้าพวกเขาไม่อยู่

การนำไปใช้บางอย่างเช่น GNU นั้นmkdirรวมถึงmkdir --parentsชื่อที่อ่านได้มากกว่า แต่ไม่ได้ระบุไว้ใน POSIX / Single Unix Specification และไม่สามารถใช้ได้กับแพลตฟอร์มทั่วไปเช่น macOS, BSD ต่าง ๆ และ Unixes เชิงพาณิชย์ต่างๆดังนั้นจึงควรหลีกเลี่ยง

หากคุณต้องการข้อผิดพลาดเมื่อไม่มีไดเรกทอรีหลักและต้องการสร้างไดเรกทอรีหากไม่มีอยู่คุณสามารถtestสร้างไดเรกทอรีได้ก่อน:

[ -d foo ] || mkdir foo

11
ตัวอย่างที่สั้นลงที่คุณใช้คือสิ่งที่คุณไม่ควรทำ เป็นการย้อนกลับตรรกะเพื่อประหยัดพื้นที่การเข้ารหัส แต่ควรใช้! และ && และทำให้ผู้อ่านที่อ่านเข้าใจมากขึ้น
Mike Q

16
@AndreasLarsen คำถามนี้เกี่ยวmkdirกับระบบ Unix-like ไม่ใช่ Windows -pเป็นสิ่งจำเป็นสำหรับการปฏิบัติตาม POSIX / โสดสเปก Unix -pดังนั้นอะไรที่เจตนาเพื่อให้สอดคล้องกับข้อกำหนดของผู้ที่จะให้การสนับสนุน Windows นั้นแตกต่างอย่างสิ้นเชิงยกเว้นว่าคุณใช้เลเยอร์การจำลอง POSIX เช่น Cygwin หรือ MSYS
Brian Campbell

22
ฉันค้นพบสิ่งที่น่าสนใจวันนี้ด้วยmkdir -pคุณสามารถใช้วงเล็บ! {}เพื่อสร้างแผนผังไดเรกทอรี "ซับซ้อน" ในคำสั่ง ดูที่นี่: technosophos.com/2010/04/15/...
Herve

12
@ MikeQ ฉันชอบ||แทนที่จะเป็น&&เพราะทั้งบรรทัดมีสถานะทางออกที่ถูกต้อง สำคัญถ้าเชลล์ของคุณรันด้วยerrexitหรือถ้าบรรทัดนั้นเป็นอันสุดท้ายในฟังก์ชั่นสวิตช์ตัวเรือนหรืออะไรก็ตาม
rudimeier

9
@herve ที่ไม่มีส่วนเกี่ยวข้องกับmkdir; mkdirเปลือกขยายการแสดงออกดังกล่าวไปยังรายการที่ไม่ต่อเนื่องของการโต้แย้งที่มีการส่งผ่านไปยัง
chepner

176

สิ่งนี้น่าจะใช้ได้:

$ mkdir -p dir

หรือ:

if [[ ! -e $dir ]]; then
    mkdir $dir
elif [[ ! -d $dir ]]; then
    echo "$dir already exists but is not a directory" 1>&2
fi

ซึ่งจะสร้างไดเรกทอรีหากไม่มีอยู่ แต่เตือนคุณว่าชื่อของไดเรกทอรีที่คุณพยายามสร้างนั้นมีการใช้งานโดยผู้อื่นที่ไม่ใช่ไดเรกทอรีแล้ว


ฉันไม่คิดว่ามีตัวดำเนินการ -d ใน korn แต่ใช้ -e สำหรับทั้งไฟล์ / ไดเรกทอรีและตรวจสอบการมีอยู่ พวกเขาทั้งหมดกลับมา 0 เมื่อประสบความสำเร็จดังนั้น! ซ้ำซ้อน ช่วยแก้ให้ด้วยนะถ้าฉันผิด.
alkar

1
ผิดทั้งสองอย่าง AFAIK การทดสอบกลับมาจริงเมื่อประสบความสำเร็จและ -d ก็มีอยู่เช่นกัน (อย่างน้อยใน MacOS X)
Alnitak

5
มันอาจจะคุ้มค่าที่จะกล่าวถึงว่ามันไม่ค่อยปลอดภัยสำหรับเธรด ระหว่างเวลาที่คุณตรวจสอบว่ามีไดเรกทอรีอยู่และเวลาที่คุณพยายามเขียนสิ่งต่าง ๆ อาจเปลี่ยนแปลงได้
Justin L.


73

การนิยามแผนผังไดเร็กทอรีที่ซับซ้อนด้วยคำสั่งเดียว

mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

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

18
โปรดทราบว่านี่ไม่ใช่คุณลักษณะของmkdirตัวเอง แต่เชลล์ที่ดำเนินการคำสั่ง มันเรียกว่าการขยายรั้ง - AFAIK เพียง Bash, ksh, zsh และ C เชลล์สนับสนุน
Daniel Kamil Kozar

3
หากคุณมีช่องว่างรอบเครื่องหมายจุลภาคคุณอาจ (จะ) ได้รับผลลัพธ์ที่ไม่คาดคิด ระวัง.
Atlas7

1
@ Atlas7 กล่าวว่าคุณจะต้องหลบหนีตัวละครที่ปกติจะเป็นส่วนหนึ่งของ regex (เช่นแทนที่จะใช้folder nameคุณต้องใช้folder\ name)
John Hamilton

1
นี่ไม่ใช่คำตอบ นี่เป็นหัวข้อที่แยกต่างหากซึ่งน่าจะเหมาะสมกว่าสำหรับความคิดเห็น
Chris Page

40

หากคุณไม่ต้องการแสดงข้อความแสดงข้อผิดพลาด:

[ -d newdir ] || mkdir newdir

หากคุณต้องการแสดงข้อความแสดงข้อผิดพลาดของคุณเอง:

[ -d newdir ] && echo "Directory Exists" || mkdir newdir

20

เก่าที่พยายามและจริง

mkdir /tmp/qq >/dev/null 2>&1

จะทำสิ่งที่คุณต้องการโดยไม่มีเงื่อนไขการแข่งขันหลายวิธีแก้ไขอื่น ๆ มี

บางครั้งการแก้ปัญหาที่ง่ายที่สุด (และน่าเกลียดที่สุด) นั้นดีที่สุด


5
สิ่งนี้จะล้มเหลวหากไม่มี "tmp" ไม่ได้ให้การยืนยันใด ๆ กับคุณ
Mike Q

15

mkdir fooทำงานแม้ว่าไดเรกทอรีจะมีอยู่ หากต้องการทำให้มันใช้งานได้หากไม่มีไดเรกทอรีชื่อ "foo" อยู่ให้ลองใช้การ-pตั้งค่าสถานะ

ตัวอย่าง: -

mkdir -p foo

สิ่งนี้จะสร้างไดเรกทอรีชื่อ "foo" ต่อเมื่อไม่มีอยู่ :)


2
ตามที่กล่าวถึงโดย @BrianCampbell สิ่งนี้จะสร้างไดเรกทอรีอื่น ๆ ในเส้นทาง สิ่งนี้อาจเป็นอันตรายได้หากปริมาณดังกล่าวไม่ได้ถูกต่อเชื่อมเนื่องจากอาจสร้างไดเรกทอรีในจุดเชื่อมต่อ
uliwitness


10

หรือถ้าคุณต้องการตรวจสอบการมีอยู่ก่อน:

if [[ ! -e /path/to/newdir ]]; then
            mkdir /path/to/newdir
fi

-eคือการทดสอบที่มีอยู่สำหรับเปลือก korn

คุณสามารถลอง googling korn เชลล์ด้วยตนเองได้


10

mkdir ไม่รองรับ -p switch อีกต่อไปในระบบ Windows 8+

คุณสามารถใช้สิ่งนี้:

IF NOT EXIST dir_name MKDIR dir_name

10
OP เกี่ยวกับ AIX kornshell ... ไม่มีส่วนเกี่ยวข้องกับ Windows ใช่ไหม?
J. Chomel

9

อ้างถึง man page man mkdirสำหรับตัวเลือก -p

   -p, --parents
          no error if existing, make parent directories as needed

ซึ่งจะสร้างไดเรกทอรีทั้งหมดในเส้นทางที่กำหนดถ้ามีอยู่ไม่มีข้อผิดพลาดอย่างอื่นมันจะสร้างไดเรกทอรีทั้งหมดจากซ้ายไปขวาในเส้นทางที่กำหนด ลองคำสั่งด้านล่าง ไดเร็กทอรีnewdirและanotherdirไม่มีอยู่ก่อนเรียกใช้คำสั่งนี้

การใช้งานที่ถูกต้อง

mkdir -p /tmp/newdir/anotherdir

หลังจากรันคำสั่งคุณสามารถเห็นnewdirและanotherdirสร้างภายใต้ / tmp คุณสามารถออกคำสั่งนี้หลาย ๆ exit(0)ครั้งที่คุณต้องการคำสั่งมักจะมี เนื่องจากเหตุผลนี้คนส่วนใหญ่จึงใช้คำสั่งนี้ในเชลล์สคริปต์ก่อนที่จะใช้พา ธ ที่แท้จริงเหล่านั้น


8

คุณสามารถใช้ถ้าวนรอบเพื่อตรวจสอบว่าไดเรกทอรีมีอยู่หรือไม่ถ้ามันไม่ออกจากกว่าสร้างไดเรกทอรี

1) dir = / home / dir_name

if [ ! -d $dir ]
then
     mkdir $dir
else
     echo "Directory exists"  
fi

2) คุณสามารถใช้ไดเรกทอรี mkdir พร้อมกับตัวเลือก -p เพื่อสร้างไดเรกทอรี มันจะตรวจสอบว่าไดเรกทอรีไม่พร้อมใช้งานหรือไม่

mkdir -p $dir

mkdir -p ยังอนุญาตให้สร้างโครงสร้างต้นไม้ของไดเรกทอรี หากคุณต้องการสร้างไดเรกทอรีหลักและไดเรกทอรีย่อยโดยใช้คำสั่งเดียวกันสามารถเลือก mkdir -p

mkdir -p /home/parent_dir /home/parent_dir/child1 /home/parent_dir/child2

มีประโยชน์ในการใช้ if loop หรือไม่? ทำไมบางคนถึงเลือกตัวเลือกมากกว่า -p!
pedram bashiri

1
ฉันได้แชร์วิธีการสร้างโฟลเดอร์เมื่อไม่มีโฟลเดอร์ มันขึ้นอยู่กับความต้องการในหนึ่ง หากคุณมีกรณีการใช้งานที่คุณต้องตรวจสอบว่าไม่มีโฟลเดอร์อยู่หรือไม่และคุณต้องการติดตามเพื่อให้คุณสามารถไปกับโซลูชันที่ 1 หากไม่เป็นไรคุณสามารถไปที่โซลูชัน 2 ได้จะสร้างโฟลเดอร์ขึ้นมา ถ้าไม่มี
AbhinavVaidya8

ฉันไม่เห็นลูป
Amit Naidu

3

นี่เป็นฟังก์ชั่นเรียบง่าย (bash shell) ซึ่งช่วยให้คุณสร้างไดเรกทอรีได้หากไม่มีอยู่

#----------------------------------
# Create a directory if it doesn't exist
#------------------------------------
createDirectory() {
    if [ ! -d $1 ]
        then
        mkdir -p $1
    fi
}

คุณสามารถเรียกฟังก์ชั่นด้านบนเป็น:

createDirectory / tmp / fooDir / BarDir

ด้านบนสร้าง fooDir และ BarDir หากไม่มีอยู่ หมายเหตุตัวเลือก "-p" ในคำสั่ง mkdir ซึ่งสร้างไดเรกทอรีซ้ำ หวังว่านี่จะช่วยได้



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