รับพาเรนต์ไดเร็กทอรีสำหรับไฟล์


24

ฉันต้องการชื่อไดเรกทอรีหลักสำหรับไฟล์

ตัวอย่าง: เมื่อฉันมีpath=/a/b/c/d/fileฉันต้องการเพียง แต่dไม่/a/b/c/d(ซึ่งฉันได้รับจากdirname $path) เป็นเอาต์พุต

มีวิธีที่ซับซ้อนในการทำเช่นนี้?

คำตอบ:


26

ดูเหมือนว่าคุณต้องการชื่อฐานของ dirname:

$ filepath=/a/b/c/d/file
$ parentname="$(basename "$(dirname "$filepath")")"
$ echo "$parentname"
d

ทำไมฉันถึงได้รับ แทนไดเรกทอรีแม่บนเดเบียน?
อาเมียร์

@Amir: คุณเริ่มต้นด้วยเส้นทางแบบเต็มหรือเพียงแค่ชื่อไฟล์? หากเป็นเพียงชื่อไฟล์dirnameคำสั่งจะถือว่าอยู่ในไดเรกทอรีปัจจุบัน (aka ".")
Gordon Davisson

ดีฉันใช้สิ่งนี้:parentname="$(basename "$(dirname "$pwd")")"
อาเมียร์

1
@Amir: ตัวแปรเชลล์คำนึงถึงตัวพิมพ์เล็กและใหญ่และPWDต้องเป็นตัวพิมพ์ใหญ่ ลองparentname="$(basename "$(dirname "$PWD")")"ดู
Gordon Davisson

5

คุณสามารถใช้ pwd เพื่อรับไดเร็กทอรีการทำงานปัจจุบันและใช้การขยายพารามิเตอร์เพื่อหลีกเลี่ยงการฟาดลงในเชลล์ (ย่อย) อีกอัน

echo ${PWD##*/}

แก้ไข: แหล่งที่พิสูจน์แล้ว


คำถามไม่มีส่วนเกี่ยวข้องกับไดเรกทอรีปัจจุบัน คุณสามารถใช้${path##*/}
Matteo

2

ฉันคิดว่านี่เป็นวิธีแก้ปัญหาที่น้อยกว่าทรัพยากร:

 $ 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`
Gordon Davisson

จริง แต่ไดเรกทอรีหลักของfoofileคืออะไร? หากมันไม่ได้เป็นเส้นทางแบบเต็มไม่สามารถรู้ได้ (อาจfoofileจะเป็นไฟล์ที่มีอยู่ไม่เพียง "สตริง")
uzsolt

1

ใน bash ในหนึ่งบรรทัด:

$ dirname /a/b/c/d/file | sed 's,^\(.*/\)\?\([^/]*\),\2,'

2
คุณช่วยอธิบายขั้นตอนที่เกี่ยวข้องได้อย่างละเอียดได้ไหม? มันสามารถช่วยให้ผู้อ่านในอนาคต นอกจากนี้โปรดพยายามอย่าเขียน 1/2 คำตอบบรรทัด
Lorenzo Von Matterhorn

0

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