我正在尝试为SVN写一个提交后的钩子,它托管在我们的开发服务器上。我的目标是尝试自动将已提交项目的副本检出到服务器上托管该项目的目录。然而,我需要能够读取目录字符串传递给脚本的最后一个目录,以便签出到我们的项目托管的同一子目录。

例如,如果我让一个SVN提交到项目“example”,我的脚本会得到“/usr/local/ SVN /repos/example”作为它的第一个参数。我需要从字符串的末尾获得“示例”,然后将它与另一个字符串连接,这样我就可以签出到“/server/root/example”,并立即看到更改。


当前回答

Basename删除路径的目录前缀:

$ basename /usr/local/svn/repos/example
example
$ echo "/server/root/$(basename /usr/local/svn/repos/example)"
/server/root/example

其他回答

在不使用外部命令的情况下打印文件名,

Run:

fileNameWithFullPath="${fileNameWithFullPath%/}";
echo "${fileNameWithFullPath##*/}" # print the file name

该命令的运行速度必须比basename和dirname快。

下面的方法可以用来获取路径名的任意路径:

some_path=a/b/c
echo $(basename $some_path)
echo $(basename $(dirname $some_path))
echo $(basename $(dirname $(dirname $some_path)))

输出:

c
b
a

Bash可以在不调用外部basename的情况下获取路径的最后一部分:

dir="/path/to/whatever/"
dir="${dir%/}"             # strip trailing slash (if any)
subdir="${dir##*/}"

这使用Bash的参数展开来删除最后(剩下的)斜杠之前的字符串部分。

Basename删除路径的目录前缀:

$ basename /usr/local/svn/repos/example
example
$ echo "/server/root/$(basename /usr/local/svn/repos/example)"
/server/root/example