ใน Bash VAR="/home/me/mydir/file.c"
ฉันจะหาได้"/home/me/mydir"
อย่างไร
ใน Bash VAR="/home/me/mydir/file.c"
ฉันจะหาได้"/home/me/mydir"
อย่างไร
คำตอบ:
dirname
และbasename
เป็นเครื่องมือที่คุณกำลังมองหาสำหรับการแยกส่วนประกอบของเส้นทาง:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
พวกเขาไม่ได้ภายในคำสั่งทุบตี แต่พวกเขาเป็นส่วนหนึ่งกำลังของมาตรฐาน POSIX (ดูdirname
, basename
) และดังนั้นควรจะมีอยู่ในส่วนใหญ่ของระบบที่จะทำงานทุบตี
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
เพื่อหลีกเลี่ยงการพึ่งพากับbasename
และdirname
ในบันทึกที่เกี่ยวข้องหากคุณมีชื่อไฟล์หรือเส้นทางสัมพัทธ์dirname
ด้วยตัวมันเองจะไม่ช่วย readlink
สำหรับผมคำตอบที่จบลงด้วยการ
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
จากนั้นคุณสามารถรวมทั้งสองอย่างเพื่อให้ได้ไดเรกทอรีเท่านั้น
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"
เพื่อกำหนดชื่อที่กำหนดแบบเรียกซ้ำ
หากคุณสนใจไฟล์เป้าหมายที่จะเป็นลิงค์สัญลักษณ์อันดับแรกคุณสามารถตรวจสอบและรับไฟล์ต้นฉบับได้ ประโยคถ้าด้านล่างอาจช่วยคุณได้
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
ฉันเล่นกับสิ่งนี้และหาทางเลือกอื่น
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
ส่วนที่ฉันชอบคือมันง่ายต่อการขยายการสำรองข้อมูลต้นไม้:
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home
นี่คือสคริปต์ที่ฉันใช้สำหรับการตัดทอนซ้ำ แทนที่ $ 1 ด้วยไดเรกทอรีที่คุณต้องการแน่นอน
BASEDIR="$1"
IFS=$'\n'
cd $BASEDIR
for f in $(find . -type f -name ' *')
do
DIR=$(dirname "$f")
DIR=${DIR:1}
cd $BASEDIR$DIR
rename 's/^ *//' *
done
ก่อนอื่นฉันแทนที่/
ด้วยช่องว่าง ( ) จากนั้นฉันลบอักขระทั้งหมดก่อนช่องว่าง (
) ในตอนท้ายฉันลบอักขระตัวแรกที่มีที่ว่าง (
)
$ VAR="/home/me/mydir/file.c"
$ echo $VAR | tr '/' ' ' | sed 's/^.* / /' | cut -c2-
file.c
HERE=$(cd $(dirname $BASH_SOURCE) && pwd)
ที่คุณได้รับเส้นทางที่เต็มไปด้วยnew_path$(dirname ${BASH_SOURCE[0]})
= คุณเปลี่ยนไดเรกทอรีปัจจุบันด้วยcd
new_pathแล้วเรียกใช้pwd
เพื่อรับเส้นทางแบบเต็มไปยังไดเรกทอรีปัจจุบัน