我正在尝试为 SVN 编写一个提交后挂钩,该挂钩托管在我们的开发服务器上。我的目标是尝试自动将已提交项目的副本签出到服务器上托管的目录。但是,我需要能够仅读取传递给脚本的目录字符串中的最后一个目录,以便签出到托管我们的项目的同一子目录。
例如,如果我对项目“example”进行 SVN 提交,我的脚本将“/usr/local/svn/repos/example”作为其第一个参数。我需要从字符串末尾获取“example”,然后将其与另一个字符串连接起来,这样我就可以签出“/server/root/example”并立即看到更改。
basename
确实删除路径的目录前缀:
$ basename /usr/local/svn/repos/example
example
$ echo "/server/root/$(basename /usr/local/svn/repos/example)"
/server/root/example
以下方法可用于获取路径名的任意路径:
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 的参数扩展来删除最后一个(剩余的)斜杠之前的字符串部分。
要打印文件名而不使用外部命令,
运行:
fileNameWithFullPath="${fileNameWithFullPath%/}";
echo "${fileNameWithFullPath##*/}" # print the file name
此命令必须比
basename
和 dirname
运行得更快。
以下可用于获取路径的最后 N 部分:
path=a/b/c
realpath -m --relative-to="a/" "$path"
-m, --canonicalize-missing 不需要存在任何路径组件或者是目录
如果文件在当前目录中,您将邀请这个简短的:
cd /dev/shm
basename $(pwd) # shm
我已经有了这个 sed 命令,尽管我承认它不太实用:
path="/dev/shm"
sed -r "s/^.*\/(.*)$/\1/" <<< $path # shm