ในสคริปต์ของฉันฉันต้องการไดเร็กทอรีของไฟล์ที่ฉันใช้งานอยู่ ยกตัวอย่างเช่นไฟล์ = "สิ่งที่ / สำรอง / file.zip" ฉันต้องมีวิธีที่จะได้รับสตริง " สิ่ง / สำรอง / " $file
จากตัวแปร
ในสคริปต์ของฉันฉันต้องการไดเร็กทอรีของไฟล์ที่ฉันใช้งานอยู่ ยกตัวอย่างเช่นไฟล์ = "สิ่งที่ / สำรอง / file.zip" ฉันต้องมีวิธีที่จะได้รับสตริง " สิ่ง / สำรอง / " $file
จากตัวแปร
คำตอบ:
dirname $file
คือสิ่งที่คุณกำลังมองหา
dirname "$file"
ค่อนข้าง. หากไม่มีเครื่องหมายคำพูดสิ่งนี้จะทำงานผิดปกติหากไฟล์หรือชื่อไดเร็กทอรีมีช่องว่าง
dirname $file
จะส่งออก
stuff/backup
ซึ่งตรงข้ามกับbasename
:
basename $file
จะส่งออก
file.zip
การใช้${file%/*}
like ที่แนะนำโดย Urvin / LuFFy นั้นดีกว่าในทางเทคนิคเนื่องจากคุณไม่ต้องพึ่งพาคำสั่งภายนอก ที่จะได้รับ basename ${file##*/}
ในลักษณะเดียวกับที่คุณสามารถทำได้ ไม่จำเป็นต้องใช้คำสั่งภายนอกเว้นแต่คุณจำเป็นต้องใช้
file="/stuff/backup/file.zip"
filename=${1##*/} # file.zip
directory=${1%/*} # /stuff/backup
นอกจากนี้ยังเป็นไปตาม POSIX อย่างสมบูรณ์ด้วยวิธีนี้ หวังว่าจะช่วยได้! :-)
dirname
มีข้อได้เปรียบเหนือแนวทางในตัว (ที่มีประสิทธิภาพมากกว่า) และนั่นคือถ้าคุณไม่แน่ใจว่าเส้นทางของคุณมีคุณสมบัติครบถ้วนที่จะเริ่มต้นด้วย หากคุณมีfile=file.zip
, dirname "$file"
จะกลับมา.
ในขณะที่จะกลับมา${file%/*}
file.zip
case $file in */*) dir=${file%/*};; *) dir=.;; esac
ยังคงเป็น POSIX-y และแก้ไขปัญหาได้
สำหรับการเดินทางdirectorypath
จากfilepath
:
file="stuff/backup/file.zip"
dirPath=${file%/*}/
echo ${dirPath}
เพียงแค่ใช้ $ dirname /home/~username/stuff/backup/file.zip
มันจะกลับมา /home/~username/stuff/backup/
dirname $file