แยกไดเร็กทอรีจากพา ธ


123

ในสคริปต์ของฉันฉันต้องการไดเร็กทอรีของไฟล์ที่ฉันใช้งานอยู่ ยกตัวอย่างเช่นไฟล์ = "สิ่งที่ / สำรอง / file.zip" ฉันต้องมีวิธีที่จะได้รับสตริง " สิ่ง / สำรอง / " $fileจากตัวแปร

คำตอบ:


204
dirname $file

คือสิ่งที่คุณกำลังมองหา


+1 เอาชนะฉันไปเลย จะเร็วกว่า แต่ได้รับการเสนอให้เข้ามากกว่าdirname $file
matchew

1
dirname "$file"ค่อนข้าง. หากไม่มีเครื่องหมายคำพูดสิ่งนี้จะทำงานผิดปกติหากไฟล์หรือชื่อไดเร็กทอรีมีช่องว่าง
Charles Duffy

fml คำถามควรแยก dir สัมบูรณ์จากไฟล์ฉันจะทำอย่างไร dirname ให้เส้นทางสัมพัทธ์ฉันเดา
Alexander Mills

เป็นเรื่องที่โดดเด่นว่าสิ่งนี้ทำได้ยากเพียงใดใน win Batch script - อีกเหตุผลหนึ่งที่ไม่ใช้พวกเขาฉันคิดว่า!
bunkerdive

47
dirname $file

จะส่งออก

stuff/backup

ซึ่งตรงข้ามกับbasename:

basename $file

จะส่งออก

file.zip

ฉันคิดว่า Matt จะสามารถคิดได้จากที่นั่น (man dirname) :)
Matthieu

1
ฉันคิดว่าเราทุกคนอยู่ที่นี่ของ Matt เพียงแค่การคาดเดา แต่ฉันแค่พยายามแยกแยะคำตอบของฉันกับของคุณ =)
matchew

ใช่ฉันใช้ชื่อฐานมากเกินไปมันก็ดีมาก =) แต่ฉันไม่พบอะไรเกี่ยวกับการส่งคืน dir ของไฟล์ใน google! ฉันเดาว่าฉันไม่ได้ค้นหาคำที่ถูกต้อง ฮะพวกเราทั้ง 3 คน Matt? : D
Matt

1
พิจารณาเพิ่มเครื่องหมายคำพูดที่จำเป็นเพื่อให้แน่ใจว่าคำสั่งเหล่านี้ใช้งานได้กับชื่อที่มีช่องว่าง (อักขระลูกโลก ฯลฯ )
Charles Duffy

3

การใช้${file%/*}like ที่แนะนำโดย Urvin / LuFFy นั้นดีกว่าในทางเทคนิคเนื่องจากคุณไม่ต้องพึ่งพาคำสั่งภายนอก ที่จะได้รับ basename ${file##*/}ในลักษณะเดียวกับที่คุณสามารถทำได้ ไม่จำเป็นต้องใช้คำสั่งภายนอกเว้นแต่คุณจำเป็นต้องใช้

file="/stuff/backup/file.zip"
filename=${1##*/}     # file.zip
directory=${1%/*}     # /stuff/backup

นอกจากนี้ยังเป็นไปตาม POSIX อย่างสมบูรณ์ด้วยวิธีนี้ หวังว่าจะช่วยได้! :-)


1
มีอยู่กรณีหนึ่งที่dirnameมีข้อได้เปรียบเหนือแนวทางในตัว (ที่มีประสิทธิภาพมากกว่า) และนั่นคือถ้าคุณไม่แน่ใจว่าเส้นทางของคุณมีคุณสมบัติครบถ้วนที่จะเริ่มต้นด้วย หากคุณมีfile=file.zip, dirname "$file"จะกลับมา.ในขณะที่จะกลับมา${file%/*} file.zip
Charles Duffy

1
... แน่นอนคุณสามารถแยกสาขา: case $file in */*) dir=${file%/*};; *) dir=.;; esacยังคงเป็น POSIX-y และแก้ไขปัญหาได้
Charles Duffy


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