Каков самый простой способ удалить конечную косую черту из каждого параметра?
Каков самый простой способ удалить конечную косую черту из каждого параметра в массиве [email protected], чтобы rsync
копировал каталоги по имени?
rsync -a --exclude='*~' "[email protected]" "$dir"
Название было изменено для уточнения. Чтобы понять комментарии и ответ на несколько трейлинг-косых черт, просмотрите историю изменений.
Ответы
Ответ 1
Вы можете использовать расширение ${parameter%word}
, которое подробно описано здесь. Вот простой тест script, который демонстрирует поведение:
#!/bin/bash
# Call this as:
# ./test.sh one/ two/ three/
#
# Output:
# one two three
echo ${@%/}
Ответ 2
Это работает для меня: ${VAR%%+(/)}
Как описано здесь http://wiki.bash-hackers.org/syntax/pattern
Может потребоваться установить опцию оболочки extglob. Я не вижу, чтобы он был включен для меня, но он все еще работает
Ответ 3
Принятый ответ обрезает ОДИН конец слэш.
Один способ обрезки нескольких завершающих косых черт выглядит следующим образом:
VALUE=/looks/like/a/path///
TRIMMED=$(echo $VALUE | sed 's:/*$::')
echo $VALUE $TRIMMED
Какие выходы:
/looks/like/a/path/// /looks/like/a/path
Ответ 4
В zsh вы можете использовать модификатор :a
.
export DIRECTORY='/some//path/name//'
echo "${DIRECTORY:a}"
=> /some/path/name
Это действует как realpath
, но не прерывается с отсутствием файлов/каталогов в качестве аргумента.
Ответ 5
realpath
разрешает заданный путь. Помимо прочего, он также удаляет трейлинг-косые черты. Используйте -s
для предотвращения следующих симлинков
DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
Ответ 6
FYI, я добавил эти две функции в мой .bash_profile
на основе ответов, найденных на SO. Как сказал Крис Джонсон, все ответы с использованием ${x%/}
удаляют только одну косую черту, эти функции будут делать то, что они говорят, надеюсь, что это полезно.
rem_trailing_slash() {
echo $1 | sed 's/\/*$//g'
}
force_trailing_slash() {
echo $(rem_trailing_slash $1)/
}