Каков самый простой способ удалить завершающую косую черту из каждого параметра в массиве '$ @', чтобы rsync
каталоги копировались по имени?
rsync -a --exclude='*~' "$@" "$dir"
Название изменено для пояснения. Чтобы понять комментарии и ответить о нескольких завершающих косых чертах, просмотрите историю редактирования.
Ответы:
Вы можете использовать
${parameter%word}
расширение, которое подробно описано здесь . Вот простой тестовый сценарий, демонстрирующий поведение:#!/bin/bash # Call this as: # ./test.sh one/ two/ three/ # # Output: # one two three echo ${@%/}
источник
shopt -s extglob; echo "${@%%+(/)}"
tr -s /
с переменным регулярным выражением, чтобы удалить повторяющиеся косые черты, а затем удалите конечную косую черту. напримерDIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
set -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"
и скажите мне, что вы видитеВ принятом ответе будет обрезана ОДНА завершающая косая черта.
Один из способов обрезать несколько конечных косых черт выглядит следующим образом:
VALUE=/looks/like/a/path/// TRIMMED=$(echo $VALUE | sed 's:/*$::') echo $VALUE $TRIMMED
Какие выходы:
источник
TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
$()
конструкции это не обязательно . Однако это также безвредно :) так что, вероятно, будет хорошей практикой использовать двойные кавычки,"$VALUE"
чтобы вам не приходилось решать, когда использовать двойные кавычки, а когда нет.echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)/*$|\1|'
не работает (поскольку группа захвата также соответствует конечной косой черте, я думаю). Я могу сделать это двумя командами:echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'
но интересно, можно ли это сделать с помощью одной?sed 's:/*$::' < in.txt > out.txt
делает работу за секундыЭто работает для меня:
${VAR%%+(/)}
Как описано здесь http://wiki.bash-hackers.org/syntax/pattern
Может потребоваться установить параметр оболочки extglob. Я не вижу, чтобы он был включен для меня, но он все еще работает
источник
shopt extglob
без параметровextglob
.${VAR%/}
realpath
разрешает заданный путь. Помимо прочего, он также удаляет завершающие слэши. Используйте-s
для предотвращения следующих симлинковDIR=/tmp/a/// echo $(realpath -s $DIR) # output: /tmp/a
источник
realpath
произойдет сбой.realpath --canonicalize-missing
абсолютно корректно работает с любой несуществующей частью путиК вашему сведению, я добавил эти две функции к себе
.bash_profile
на основе ответов, найденных на SO. Как сказал Крис Джонсон, все ответы с использованием${x%/}
удаляют только одну косую черту, эти функции будут делать то, что они говорят, надеюсь, это полезно.rem_trailing_slash() { echo "$1" | sed 's/\/*$//g' } force_trailing_slash() { echo "$(rem_trailing_slash "$1")/" }
источник
В zsh вы можете использовать
:a
модификатор.export DIRECTORY='/some//path/name//' echo "${DIRECTORY:a}" => /some/path/name
Это действует
realpath
как аргумент, но не приводит к ошибке с отсутствующими файлами / каталогами.источник