从“$@”数组中的每个参数中删除尾部斜杠的最简单方法是什么,以便rsync
按名称复制目录?
rsync -a --exclude='*~' "$@" "$dir"
为澄清起见,已更改标题。要了解有关多个尾随斜杠的评论和答案,请参阅编辑历史记录。
从“$@”数组中的每个参数中删除尾部斜杠的最简单方法是什么,以便rsync
按名称复制目录?
rsync -a --exclude='*~' "$@" "$dir"
为澄清起见,已更改标题。要了解有关多个尾随斜杠的评论和答案,请参阅编辑历史记录。
您可以使用此处${parameter%word}
详述的扩展。这是一个演示该行为的简单测试脚本:
#!/bin/bash
# Call this as:
# ./test.sh one/ two/ three/
#
# Output:
# one two three
echo ${@%/}
接受的答案将修剪一个尾随斜杠。
修剪多个尾部斜杠的一种方法是这样的:
VALUE=/looks/like/a/path///
TRIMMED=$(echo $VALUE | sed 's:/*$::')
echo $VALUE $TRIMMED
哪个输出:
/looks/like/a/path/// /looks/like/a/path
这对我有用:${VAR%%+(/)}
如此处所述http://wiki.bash-hackers.org/syntax/pattern
可能需要设置 shell 选项 extglob。我看不到它为我启用,但它仍然有效
realpath
解析给定的路径。除其他外,它还删除了尾部斜杠。用于-s
防止以下 simlinks
DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
仅供参考,我.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
但不会因为缺少文件/目录作为参数而失败。
不是最美丽的方式,但又快又容易。
我只是添加一个斜线并删除所有双打。假设这种模式不会在其他地方找到。
WORD="abc/"
WORD=$WORD'/'
WORD=`echo $WORD | sed s/'\/\/'/''/g`
echo $WORD
注意接受的答案中的一些评论:
//[...]
用单个斜杠替换所有重复的斜杠/
(根据@Dave 评论)/
)(根据@GordonDavisson 评论)trimSlash() { for s; do sed -E 's://*:/:g; s:(^/)?/*$:\1:' <<< "${s}"; done; }
不像使用参数替换的答案那样简洁,但我认为值得努力。
一些测试用例:
$ trimSlash "/" "///" "a/" "a/a/" "a///a/" "a/a" "a///a" "a///" "/a/a/" "///a///"
/
/
a
a/a
a/a
a/a
a/a
a
/a/a
/a
我使用的方法,在修剪用于 的目录参数时rsync
,在这里使用dirname
andbasename
分割路径,然后重新组合不带斜杠的部分。
raw_dir=/a/b/c/
trim_dir=$(dirname "$raw_dir")"/"$(basename "$raw_dir")