Qual é a maneira mais simples de remover uma barra final de cada parâmetro no array '$ @', de modo que rsync
copie os diretórios por nome?
rsync -a --exclude='*~' "$@" "$dir"
O título foi alterado para esclarecimento. Para entender os comentários e responder sobre as várias barras finais, consulte o histórico de edição.
Respostas:
Você pode usar a
${parameter%word}
expansão detalhada aqui . Aqui está um script de teste simples que demonstra o comportamento:fonte
shopt -s extglob; echo "${@%%+(/)}"
tr -s /
com regex variável para remover barras repetidas e, em seguida, remova a barra final. por exemploDIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
set -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"
e me diga o que você vêA resposta aceita cortará UMA barra final.
Uma maneira de aparar várias barras finais é assim:
Quais saídas:
fonte
TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
$()
construção. No entanto, também é inofensivo :) portanto, é provavelmente uma boa prática usar aspas duplas"$VALUE"
para não ter que decidir quando e quando não usá-las.echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)/*$|\1|'
não funciona (uma vez que o grupo de captura corresponde à barra final, eu acho). Posso fazer isso com dois comandos:echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'
mas gostaria de saber se poderia ser feito com um?sed 's:/*$::' < in.txt > out.txt
faz o trabalho em segundosIsso funciona para mim:
${VAR%%+(/)}
Conforme descrito aqui http://wiki.bash-hackers.org/syntax/pattern
Pode ser necessário definir a opção extglob do shell. Não consigo ver que está habilitado para mim, mas ainda funciona
fonte
shopt extglob
sem opçõesextglob
.${VAR%/}
realpath
resolve determinado caminho. Entre outras coisas, ele também remove barras finais. Use-s
para evitar seguir simlinksfonte
realpath
falhará.realpath --canonicalize-missing
funciona absolutamente corretamente com qualquer parte não existente do caminhoPara sua informação, adicionei essas duas funções à minha com
.bash_profile
base nas respostas encontradas no SO. Como disse Chris Johnson, todas as respostas usando${x%/}
remove apenas uma barra, essas funções farão o que dizem, espero que seja útil.fonte
No zsh, você pode usar o
:a
modificador.Isso funciona como,
realpath
mas não falha, com arquivos / diretórios ausentes como argumento.fonte