135

从“$@”数组中的每个参数中删除尾部斜杠的最简单方法是什么,以便rsync按名称复制目录?

rsync -a --exclude='*~' "$@" "$dir"

为澄清起见,已更改标题。要了解有关多个尾随斜杠的评论和答案,请参阅编辑历史记录。

4

9 回答 9

208

您可以使用此处${parameter%word}详述的扩展。这是一个演示该行为的简单测试脚本:

#!/bin/bash

# Call this as:
#   ./test.sh one/ two/ three/ 
#
# Output:
#  one two three

echo ${@%/}
于 2012-01-26T13:34:33.020 回答
48

接受的答案将修剪一个尾随斜杠。

修剪多个尾部斜杠的一种方法是这样的:

VALUE=/looks/like/a/path///

TRIMMED=$(echo $VALUE | sed 's:/*$::')

echo $VALUE $TRIMMED

哪个输出:

/looks/like/a/path/// /looks/like/a/path
于 2015-09-29T13:45:56.400 回答
31

这对我有用:${VAR%%+(/)}

如此处所述http://wiki.bash-hackers.org/syntax/pattern

可能需要设置 shell 选项 extglob。我看不到它为我启用,但它仍然有效

于 2015-01-08T17:55:49.160 回答
25

realpath解析给定的路径。除其他外,它还删除了尾部斜杠。用于-s防止以下 simlinks

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
于 2017-07-07T14:36:01.073 回答
10

仅供参考,我.bash_profile根据在 SO 上找到的答案将这两个功能添加到我的。正如克里斯约翰逊所说,所有答案都使用${x%/}删除一个斜线,这些功能会做他们所说的,希望这很有用。

rem_trailing_slash() {
    echo "$1" | sed 's/\/*$//g'
}

force_trailing_slash() {
    echo "$(rem_trailing_slash "$1")/"
}
于 2016-08-16T11:04:07.670 回答
4

zsh中,您可以使用:a修饰符。

export DIRECTORY='/some//path/name//'

echo "${DIRECTORY:a}"

=> /some/path/name

这就像realpath但不会因为缺少文件/目录作为参数而失败。

于 2015-10-28T01:03:44.253 回答
0

不是最美丽的方式,但又快又容易。

我只是添加一个斜线并删除所有双打。假设这种模式不会在其他地方找到。

WORD="abc/"
WORD=$WORD'/'
WORD=`echo $WORD | sed s/'\/\/'/''/g`
echo $WORD
于 2021-06-08T17:38:02.850 回答
0

注意接受的答案中的一些评论:

  1. //[...]用单个斜杠替换所有重复的斜杠/(根据@Dave 评论)
  2. 删除尾部斜杠,除非它也是前导斜杠(即根文件路径/)(根据@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
于 2021-10-07T17:27:15.880 回答
0

我使用的方法,在修剪用于 的目录参数时rsync,在这里使用dirnameandbasename分割路径,然后重新组合不带斜杠的部分。

raw_dir=/a/b/c/
trim_dir=$(dirname "$raw_dir")"/"$(basename "$raw_dir")
于 2022-02-17T22:00:18.787 回答