Di Bash, jika VAR="/home/me/mydir/file.c"
, bagaimana saya dapatkan "/home/me/mydir"
?
400
dirname
dan basename
apakah 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.
Untuk menghindari ketergantungan dengan
basename
dandirname
sumber
Pada catatan terkait, jika Anda hanya memiliki nama file atau jalur relatif,
dirname
dengan sendirinya tidak akan membantu. Bagi saya, jawabannya akhirnyareadlink
.Anda kemudian dapat menggabungkan keduanya untuk mendapatkan hanya direktori.
sumber
readlink -m "$fname"
untukJika Anda peduli file target menjadi tautan simbolis, pertama Anda dapat memeriksanya dan mendapatkan file aslinya. Klausa if di bawah ini dapat membantu Anda.
sumber
Saya sedang bermain dengan ini dan datang dengan alternatif.
Bagian yang saya suka adalah mudah untuk memperpanjang cadangan pohon:
sumber
Berikut ini adalah skrip yang saya gunakan untuk pemangkasan rekursif. Ganti $ 1 dengan direktori yang Anda inginkan, tentu saja.
sumber
Pertama, saya telah mengganti
/
dengan ruang kosong (). Lalu, saya menghapus semua karakter sebelum ada ruang kosong (
). Pada akhirnya, saya menghapus karakter pertama yaitu spasi kosong (
).
sumber
di mana Anda mendapatkan path lengkap dengan new_path =
$(dirname ${BASH_SOURCE[0]})
. Anda mengubah direktori saat ini dengancd
new_path dan kemudian menjalankanpwd
untuk mendapatkan path lengkap ke direktori saat ini.sumber