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

tj1*_*111 198 linux svn bash shell

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

例如,如果我对项目"example"进行SVN提交,我的脚本会将"/ usr/local/svn/repos/example"作为其第一个参数.我需要在字符串的末尾添加"示例",然后用另一个字符串连接它,这样我就可以签出到"/ server/root/example"并立即查看更改.

sth*_*sth 308

basename 会删除路径的目录前缀:

$ basename /usr/local/svn/repos/example
example
$ echo "/server/root/$(basename /usr/local/svn/repos/example)"
/server/root/example
Run Code Online (Sandbox Code Playgroud)

  • @ tj111:听起来不是`$ 1`,或者`$ 1`是空的 (5认同)
  • basename绝对是我正在寻找的.如何将参数的基本名称存储到变量中?例如`SUBDIR ="/ path/to/whatever/$(basename $ 1)"` (2认同)

Jin*_*Yao 81

可以使用以下方法获取路径名的任何路径:

pathname=a/b/c
echo $(basename $pathname)
echo $(basename $(dirname $pathname))
echo $(basename $(dirname $(dirname $pathname)))
Run Code Online (Sandbox Code Playgroud)

输出:

c
b
a
Run Code Online (Sandbox Code Playgroud)

  • 不适用于有空格的路径...您可以用引号克服这个问题...它以某种方式工作 `echo "$(basename "$(dirname "$pathname")")"` (3认同)

Pau*_*ce. 71

Bash可以获取路径的最后一部分而无需调用外部basename:

subdir="/path/to/whatever/${1##*/}"
Run Code Online (Sandbox Code Playgroud)

  • 在我的Mac上,使用子字符串表示法比dirname/basename快几个数量级,因为你正在为几千个文件中的每一个做一些微不足道的事情. (2认同)
  • @DennisWilliamson **非常感谢**分享**。_对于任何将来开始怀疑**为什么不起作用**或我是这里唯一愚蠢的读者的读者_。以上答案假设`$ 1`包含`要从中取出最后一个分量的路径`。我错过了那部分。我的用例:`target_path ='/ home / user / dir1 / dir2 / dir3 /'; target_path =“ $ {target_path%/}”; last_component = $ {target_path ## * /}; echo $ last_component`-工作 (2认同)
  • 请参阅此处以了解* $如何*和*为什么*`$ {1 ## * /}`的工作原理:https://unix.stackexchange.com/a/171786/15070 (2认同)