Di Bash, jika VAR="/home/me/mydir/file.c", bagaimana saya dapatkan "/home/me/mydir"?
Di Bash, jika VAR="/home/me/mydir/file.c", bagaimana saya dapatkan "/home/me/mydir"?
Jawaban:
dirnamedan basenameapakah alat yang Anda cari untuk mengekstraksi komponen jalur:
$ VAR=/home/me/mydir/file.c
$ DIR=$(dirname "${VAR}")
$ echo "${DIR}"
/home/me/mydir
$ basename "${VAR}"
file.c
Itu bukan perintah Bash internal tetapi itu adalah bagian dari standar POSIX (lihat dirname, basename) dan karenanya harus tersedia pada sebagian besar sistem yang akan menjalankan Bash.
$ export VAR=/home/me/mydir/file.c
$ export DIR=${VAR%/*}
$ echo "${DIR}"
/home/me/mydir
$ echo "${VAR##*/}"
file.c
Untuk menghindari ketergantungan dengan basenamedandirname
Pada catatan terkait, jika Anda hanya memiliki nama file atau jalur relatif, dirnamedengan sendirinya tidak akan membantu. Bagi saya, jawabannya akhirnya readlink.
fname='txtfile'
echo $(dirname "$fname") # output: .
echo $(readlink -f "$fname") # output: /home/me/work/txtfile
Anda kemudian dapat menggabungkan keduanya untuk mendapatkan hanya direktori.
echo $(dirname $(readlink -f "$fname")) # output: /home/me/work
readlink -m "$fname"untuk
Jika Anda peduli file target menjadi tautan simbolis, pertama Anda dapat memeriksanya dan mendapatkan file aslinya. Klausa if di bawah ini dapat membantu Anda.
if [ -h $file ]
then
base=$(dirname $(readlink $file))
else
base=$(dirname $file)
fi
Saya sedang bermain dengan ini dan datang dengan alternatif.
$ VAR=/home/me/mydir/file.c
$ DIR=`echo $VAR |xargs dirname`
$ echo $DIR
/home/me/mydir
Bagian yang saya suka adalah mudah untuk memperpanjang cadangan pohon:
$ DIR=`echo $VAR |xargs dirname |xargs dirname |xargs dirname`
$ echo $DIR
/home