¿Cuál es la forma más sencilla de eliminar una barra al final de cada parámetro en la matriz '$ @', de modo que rsync
copie los directorios por nombre?
rsync -a --exclude='*~' "$@" "$dir"
Se ha cambiado el título para aclararlo. Para comprender los comentarios y responder sobre múltiples barras inclinadas, consulte el historial de ediciones.
Respuestas:
Puede utilizar la
${parameter%word}
expansión que se detalla aquí . Aquí hay un script de prueba simple que demuestra el comportamiento:#!/bin/bash # Call this as: # ./test.sh one/ two/ three/ # # Output: # one two three echo ${@%/}
fuente
shopt -s extglob; echo "${@%%+(/)}"
tr -s /
con expresión regular variable para eliminar las barras repetidas y luego elimine la barra final. pDIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
set -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"
y dime lo que vesLa respuesta aceptada recortará UNA barra al final.
Una forma de recortar varias barras al final es la siguiente:
VALUE=/looks/like/a/path/// TRIMMED=$(echo $VALUE | sed 's:/*$::') echo $VALUE $TRIMMED
Qué salidas:
fuente
TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
$()
construcción. Sin embargo, también es inofensivo :) por lo que probablemente sea una buena práctica usar comillas dobles como"$VALUE"
para no tener que decidir cuándo y cuándo no usar las comillas dobles.echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)/*$|\1|'
no funciona (ya que el grupo de captura también coincide con la barra final, supongo). Puedo hacerlo con dos comandos:echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'
pero me preguntaba si se podría hacer con uno.sed 's:/*$::' < in.txt > out.txt
hace el trabajo en segundosEsto funciona para mi:
${VAR%%+(/)}
Como se describe aquí http://wiki.bash-hackers.org/syntax/pattern
Es posible que deba configurar la opción de shell extglob. No puedo verlo habilitado para mí, pero aún funciona
fuente
shopt extglob
sin opcionesextglob
.${VAR%/}
realpath
resuelve el camino dado. Entre otras cosas, también elimina las barras inclinadas. Úselo-s
para evitar los siguientes enlaces SIMDIR=/tmp/a/// echo $(realpath -s $DIR) # output: /tmp/a
fuente
realpath
fallará.realpath --canonicalize-missing
funciona absolutamente correctamente con cualquier parte no existente de la rutaPara su información, agregué estas dos funciones a mi
.bash_profile
basado en las respuestas encontradas en SO. Como dijo Chris Johnson, todas las respuestas que usan${x%/}
eliminan solo una barra, estas funciones harán lo que dicen, espero que esto sea útil.rem_trailing_slash() { echo "$1" | sed 's/\/*$//g' } force_trailing_slash() { echo "$(rem_trailing_slash "$1")/" }
fuente
En zsh puedes usar el
:a
modificador.export DIRECTORY='/some//path/name//' echo "${DIRECTORY:a}" => /some/path/name
Esto actúa como
realpath
pero no falla con archivos / directorios faltantes como argumento.fuente