Quelle est la façon la plus simple de supprimer une barre oblique de fin de chaque paramètre du tableau '$ @', afin que rsync
copie les répertoires par nom?
rsync -a --exclude='*~' "$@" "$dir"
Le titre a été modifié pour plus de clarté. Pour comprendre les commentaires et répondre à propos de plusieurs barres obliques de fin, consultez l'historique des modifications.
Vous pouvez utiliser le ${parameter%Word}
extension détaillée ici . Voici un script de test simple qui illustre le comportement:
#!/bin/bash
# Call this as:
# ./test.sh one/ two/ three/
#
# Output:
# one two three
echo ${@%/}
La réponse acceptée supprimera UNE barre oblique de fin.
Une façon de supprimer plusieurs barres obliques de fin est la suivante:
VALUE=/looks/like/a/path///
TRIMMED=$(echo $VALUE | sed 's:/*$::')
echo $VALUE $TRIMMED
Quelles sorties:
/looks/like/a/path/// /looks/like/a/path
Cela fonctionne pour moi: ${VAR%%+(/)}
Comme décrit ici http://wiki.bash-hackers.org/syntax/pattern
Il peut être nécessaire de définir l'option shell extglob. Je ne peux pas le voir activé pour moi, mais cela fonctionne toujours
realpath
résout un chemin donné. Entre autres choses, il supprime également les barres obliques de fin. Utilisation -s
pour éviter de suivre les liens sim
DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
Dans zsh vous pouvez utiliser le :a
modificateur.
export DIRECTORY='/some//path/name//'
echo "${DIRECTORY:a}"
=> /some/path/name
Cela agit comme realpath
mais n'échoue pas avec les fichiers/répertoires manquants comme argument.
Pour info, j'ai ajouté ces deux fonctions à mon .bash_profile
basé sur les réponses trouvées sur SO. Comme l'a dit Chris Johnson, toutes les réponses utilisant ${x%/}
supprimer une seule barre oblique, ces fonctions feront ce qu'elles disent, espérons que cela sera utile.
rem_trailing_slash() {
echo $1 | sed 's/\/*$//g'
}
force_trailing_slash() {
echo $(rem_trailing_slash $1)/
}