在Bash中获取文件路径参数中的最后dirname/filename

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

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

359553 次浏览

basename删除路径的目录前缀:

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

Bash可以获得路径的最后一部分,而不需要调用外部basename:

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

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

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

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

输出:

c
b
a

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

运行:

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

此命令必须比basenamedirname运行得快。