What is the simplest way to remove a trailing slas

2019-03-09 06:10发布

What is the simplest way to remove a trailing slash from each parameter in the '$@' array, so that rsync copies the directories by name?

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

The title has been changed for clarification. To understand the comments and answer about multiple trailing slashes see the edit history.

6条回答
该账号已被封号
2楼-- · 2019-03-09 06:29

FYI, I added these two functions to my .bash_profile based on the answers found on SO. As Chris Johnson said, all answers using ${x%/} remove only one slash, these functions will do what they say, hope this is useful.

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

force_trailing_slash() {
    echo $(rem_trailing_slash $1)/
}
查看更多
乱世女痞
3楼-- · 2019-03-09 06:35

The accepted answer will trim ONE trailing slash.

One way to trim multiple trailing slashes is like this:

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

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

echo $VALUE $TRIMMED

Which outputs:

/looks/like/a/path/// /looks/like/a/path
查看更多
干净又极端
4楼-- · 2019-03-09 06:38

realpath resolves given path. Among other things it also removes trailing slashes. Use -s to prevent following simlinks

DIR=/tmp/a///
echo $(realpath -s $DIR)
# output: /tmp/a
查看更多
我欲成王,谁敢阻挡
5楼-- · 2019-03-09 06:44

You can use the ${parameter%word} expansion that is detailed here. Here is a simple test script that demonstrates the behavior:

#!/bin/bash

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

echo ${@%/}
查看更多
The star\"
6楼-- · 2019-03-09 06:48

This works for me: ${VAR%%+(/)}

As described here http://wiki.bash-hackers.org/syntax/pattern

May need to set the shell option extglob. I can't see it enabled for me but it still works

查看更多
可以哭但决不认输i
7楼-- · 2019-03-09 06:53

In zsh you can use the :a modifier.

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

echo "${DIRECTORY:a}"

=> /some/path/name

This acts like realpath but doesn't fail with missing files/directories as argument.

查看更多
登录 后发表回答