Apa cara paling sederhana untuk menghapus garis miring dari setiap parameter dalam larik '$ @', sehingga rsync
menyalin direktori berdasarkan nama?
rsync -a --exclude='*~' "$@" "$dir"
Judul telah diubah untuk klarifikasi. Untuk memahami komentar dan jawaban tentang beberapa garis miring, lihat riwayat edit.
Jawaban:
Anda dapat menggunakan
${parameter%word}
perluasan yang dijelaskan di sini . Berikut ini skrip pengujian sederhana yang mendemonstrasikan perilaku tersebut:#!/bin/bash # Call this as: # ./test.sh one/ two/ three/ # # Output: # one two three echo ${@%/}
sumber
shopt -s extglob; echo "${@%%+(/)}"
tr -s /
dengan variabel regex untuk menghapus garis miring berulang kemudian menghapus garis miring. misalnyaDIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
set -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"
dan beri tahu saya apa yang Anda lihatJawaban yang diterima akan memangkas SATU garis miring.
Salah satu cara untuk memangkas beberapa garis miring adalah seperti ini:
VALUE=/looks/like/a/path/// TRIMMED=$(echo $VALUE | sed 's:/*$::') echo $VALUE $TRIMMED
Output mana:
sumber
TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
$()
konstruksi. Namun itu juga tidak berbahaya :) jadi mungkin praktik yang baik untuk menggunakan tanda kutip ganda seperti"$VALUE"
sehingga Anda tidak perlu memutuskan kapan dan kapan tidak menggunakan tanda kutip ganda.echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)/*$|\1|'
tidak berfungsi (karena grup penangkapan cocok dengan garis miring juga saya kira). Saya bisa melakukannya dengan dua perintah:echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'
tetapi bertanya-tanya apakah itu bisa dilakukan dengan satu perintah ?sed 's:/*$::' < in.txt > out.txt
melakukan pekerjaan dalam hitungan detikIni bekerja untuk saya:
${VAR%%+(/)}
Seperti dijelaskan di sini http://wiki.bash-hackers.org/syntax/pattern
Mungkin perlu menyetel opsi shell extglob. Saya tidak dapat melihatnya diaktifkan untuk saya tetapi masih berfungsi
sumber
shopt extglob
tanpa opsiextglob
.${VAR%/}
realpath
menyelesaikan jalur yang diberikan. Antara lain itu juga menghilangkan garis miring yang tertinggal. Gunakan-s
untuk mencegah simlinks berikutDIR=/tmp/a/// echo $(realpath -s $DIR) # output: /tmp/a
sumber
realpath
akan gagal.realpath --canonicalize-missing
bekerja benar-benar benar dengan bagian jalur yang tidak adaFYI, saya menambahkan dua fungsi ini ke saya
.bash_profile
berdasarkan jawaban yang ditemukan di SO. Seperti yang dikatakan Chris Johnson, semua jawaban menggunakan${x%/}
hanya menghapus satu garis miring, fungsi-fungsi ini akan melakukan apa yang mereka katakan, semoga ini berguna.rem_trailing_slash() { echo "$1" | sed 's/\/*$//g' } force_trailing_slash() { echo "$(rem_trailing_slash "$1")/" }
sumber
Dalam zsh Anda dapat menggunakan
:a
pengubah.export DIRECTORY='/some//path/name//' echo "${DIRECTORY:a}" => /some/path/name
Ini bertindak seperti
realpath
tetapi tidak gagal dengan file / direktori yang hilang sebagai argumen.sumber