bagaimana cara menghapus tebasan terakhir dari jalur direktori?

17

Saya memiliki skrip yang memerlukan direktori sebagai satu argumen. Saya ingin mendukung dua bentuk: satu seperti

a/b/c

(tidak ada garis miring di akhir) dan yang lainnya seperti

 a/b/c/

(memiliki garis miring pada bagian akhir).

Pertanyaan saya: diberikan salah satu dari dua bentuk, bagaimana saya bisa menjaga bentuk pertama tidak berubah dan menghapus garis miring terakhir dari bentuk kedua untuk mengubahnya menjadi bentuk pertama.

Yulong Ao
sumber
2
Bukan berarti itu akan menjadi masalah besar - tebasan ganda di mana saja kecuali pada awalnya setara dengan tebasan tunggal, jadi jangan khawatir tentang bergabung dengan mereka menggunakan /.
muru
@muru saya tidak tahu ini sebelumnya :).
Yulong Ao
Inilah Q / A yang bagus pada Pemisah Jalur Berturutan Berturutan
Peter.O
1
@muru Garis miring pada akhirnya dapat membuat perbedaan, seperti perbedaan antara bertindak pada symlink dan bertindak pada direktori yang ditunjuknya, atau argumen sumber rsync.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles memang, tetapi seperti yang Anda lihat, saya berbicara tentang bergabung dengan jalur.
muru

Jawaban:

23
dir=${1%/}

akan mengambil parameter pertama skrip dan menghapus garis miring jika ada.

glenn jackman
sumber
12

Untuk menghapus trailing slash jika ada, Anda dapat menggunakan konstruksi ekspansi parameter suffix yang ada di semua shell gaya POSIX:

x=${x%/}

Ada beberapa komplikasi. Ini hanya menghapus satu tebasan, jadi jika Anda memulai dengan a/b/c//maka Anda masih akan berakhir dengan tebasan. Selanjutnya, jika jalur aslinya adalah /, Anda harus menjaga garis miring. Berikut ini solusi yang lebih kompleks yang menangani kasus-kasus ini:

case $x in
  *[!/]*/) x=${x%"${x##*[!/]}"};;
  *[/]) x="/";;
esac

Atau, dalam ksh, atau dalam bash setelah shopt -s extglob:

[[ x = *[!/] ]] || x=${x%%*(/)}

Perhatikan bahwa dalam banyak kasus, tidak masalah ada garis miring. Tidak masalah jika argumennya adalah tautan simbolik ke direktori: dengan garis miring, argumen menunjuk direktori, sedangkan tanpa garis miring, argumen menunjuk tautan simbolik itu sendiri. Ini juga penting dengan beberapa program lain, misalnya argumen sumber rsyncdiperlakukan berbeda tergantung pada adanya garis miring.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
2

realpathmenyelesaikan jalur yang diberikan. Antara lain itu juga menghilangkan garis miring. Gunakan -suntuk mencegah simlink berikut

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
czerny
sumber