从'$ @'数组中的每个参数中删除尾部斜杠,以便rsync
按名称复制目录的最简单方法是什么?
rsync -a --exclude='*~' "$@" "$dir"
为了澄清起见,标题已更改。要了解注释和有关多个斜杠的答案,请参阅编辑历史记录。
Answers:
您可以使用此处${parameter%word}
详细介绍的扩展。这是一个演示行为的简单测试脚本:
#!/bin/bash
# Call this as:
# ./test.sh one/ two/ three/
#
# Output:
# one two three
echo ${@%/}
shopt -s extglob; echo "${@%%+(/)}"
tr -s /
与变量正则表达式结合使用以删除重复的斜杠,然后删除结尾的斜杠。例如DIR=$(echo //some///badly/written///dir////// | tr -s /); DIR=${DIR%/}
set -- one///// two// three four/; shopt -s extglob; echo "${@%%+(/)}"
并告诉我您看到的内容
接受的答案将修剪一个尾随的斜杠。
修剪多个尾斜杠的一种方法是这样的:
VALUE=/looks/like/a/path///
TRIMMED=$(echo $VALUE | sed 's:/*$::')
echo $VALUE $TRIMMED
哪个输出:
/looks/like/a/path/// /looks/like/a/path
TRIMMED=$(echo "$VALUE" | sed 's:/*$::')
$()
构造内部这不是必需的。但是,它也是无害的:),因此使用双引号可能是一个好习惯,"$VALUE"
这样您就不必决定何时以及何时不使用双引号了。
echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)/*$|\1|'
不起作用(因为我猜捕获组也匹配尾随斜杠)。我可以用两个命令来做:echo "https://www.example.com/foo/" | sed -e 's|https*://\(.*\)$|\1|' -e 's|/*$||'
但是想知道是否可以用一个命令来做?
sed 's:/*$::' < in.txt > out.txt
的工作即可在几秒钟内完成
这对我有用: ${VAR%%+(/)}
如此处所述http://wiki.bash-hackers.org/syntax/pattern
可能需要设置shell选项extglob。我看不到为我启用了它,但它仍然有效
shopt extglob
无选项
extglob
。
${VAR%/}
在zsh中,可以使用:a
修饰符。
export DIRECTORY='/some//path/name//'
echo "${DIRECTORY:a}"
=> /some/path/name
这就像realpath
但不会因缺少文件/目录作为参数而失败。