ฉันต้องการชื่อไดเรกทอรีหลักสำหรับไฟล์
ตัวอย่าง: เมื่อฉันมีpath=/a/b/c/d/file
ฉันต้องการเพียง แต่d
ไม่/a/b/c/d
(ซึ่งฉันได้รับจากdirname $path
) เป็นเอาต์พุต
มีวิธีที่ซับซ้อนในการทำเช่นนี้?
ฉันต้องการชื่อไดเรกทอรีหลักสำหรับไฟล์
ตัวอย่าง: เมื่อฉันมีpath=/a/b/c/d/file
ฉันต้องการเพียง แต่d
ไม่/a/b/c/d
(ซึ่งฉันได้รับจากdirname $path
) เป็นเอาต์พุต
มีวิธีที่ซับซ้อนในการทำเช่นนี้?
คำตอบ:
ดูเหมือนว่าคุณต้องการชื่อฐานของ dirname:
$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d
dirname
คำสั่งจะถือว่าอยู่ในไดเรกทอรีปัจจุบัน (aka ".")
parentname="$(basename "$(dirname "$pwd")")"
PWD
ต้องเป็นตัวพิมพ์ใหญ่ ลองparentname="$(basename "$(dirname "$PWD")")"
ดู
คุณสามารถใช้ pwd เพื่อรับไดเร็กทอรีการทำงานปัจจุบันและใช้การขยายพารามิเตอร์เพื่อหลีกเลี่ยงการฟาดลงในเชลล์ (ย่อย) อีกอัน
echo ${PWD##*/}
แก้ไข: แหล่งที่พิสูจน์แล้ว
${path##*/}
ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่น้อยกว่าทรัพยากร:
$ filepath=/a/b/c/d/file
$ echo ${${filepath%/*}##*/}
d
แก้ไข:ขออภัยการขยายตัวแบบซ้อนไม่สามารถทำได้ใน bash แต่ทำงานได้ใน zsh ทุบตีรุ่น:
$ filepath=/a/b/c/d/file
$ path=${filepath%/*}
$ echo ${path##*/}
d
filepath=file
หรือ filepath = / file`
foofile
คืออะไร? หากมันไม่ได้เป็นเส้นทางแบบเต็มไม่สามารถรู้ได้ (อาจfoofile
จะเป็นไฟล์ที่มีอยู่ไม่เพียง "สตริง")
ใน bash ในหนึ่งบรรทัด:
$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'
ฉันชอบคำตอบของ Julian67 ที่ดีที่สุด แต่นี่เป็นเวอร์ชั่นที่ขยายออกไปเล็กน้อย:
file_path = "a/b/c/d/file.txt"
parent=$(echo $file_path | sed -e 's;\/[^/]*$;;') # cut away "/file.txt";'$' is end of string
parent=$(echo $parent | sed -e 's;.*\/;;') # cut away "/a/b/c/"
echo $parent # --> you get "d"