Linux 在Bash的文件路径参数中获取last dirname/filename
我正在尝试为SVN编写一个post-commit钩子,它托管在我们的开发服务器上。我的目标是尝试将提交项目的副本自动签出到服务器上托管该项目的目录。但是,我需要能够读取传递给脚本的目录字符串中的最后一个目录,以便签出到项目所在的同一子目录 例如,如果我向项目“example”提交SVN,我的脚本将“/usr/local/SVN/repos/example”作为其第一个参数。我需要在字符串的末尾去掉“example”,然后用另一个字符串连接它,这样我就可以签出到“/server/root/example”,并立即看到更改 是否删除路径的目录前缀:Linux 在Bash的文件路径参数中获取last dirname/filename,linux,bash,shell,svn,Linux,Bash,Shell,Svn,我正在尝试为SVN编写一个post-commit钩子,它托管在我们的开发服务器上。我的目标是尝试将提交项目的副本自动签出到服务器上托管该项目的目录。但是,我需要能够读取传递给脚本的目录字符串中的最后一个目录,以便签出到项目所在的同一子目录 例如,如果我向项目“example”提交SVN,我的脚本将“/usr/local/SVN/repos/example”作为其第一个参数。我需要在字符串的末尾去掉“example”,然后用另一个字符串连接它,这样我就可以签出到“/server/root/exam
$ basename /usr/local/svn/repos/example
example
$ echo "/server/root/$(basename /usr/local/svn/repos/example)"
/server/root/example
Bash可以获取路径的最后一部分,而无需调用外部
basename
:
subdir="/path/to/whatever/${1##*/}"
以下方法可用于获取路径名的任何路径:
some_path=a/b/c
echo $(basename $some_path)
echo $(basename $(dirname $some_path))
echo $(basename $(dirname $(dirname $some_path)))
输出:
c
b
a
basename绝对是我要找的。但是,如何将参数的basename存储到变量中?例如,
SUBDIR=“/path/to/whatever/$(basename$1)”
@tj111:听起来像是没有$1
,或者$1
是空的。幸运的是,如果包装命令,basename不是一个好主意。在我的Mac上,使用子字符串表示法比dirname/basename要快多个数量级,因为你对几千个文件中的每一个都做了一些琐碎的事情。d=/home/me/somefolder;subdir=“/$d/${1###*/}”
我得到了类似于///home/me/somefolder//
的结果,$d实际上来自$(find$somefolder-maxdepth 1-type d)中d的循环
使用subdir=$(basename$d)
的效果与预期一样。@ButtleButkus:您应该使用while
而不是for
来迭代find
的输出(find-print0 | xargs-0
更好),或者使用globbing:for$SOMEFOLDER/*/
(最后的斜杠类似于-type d
-如果shopt-s globstar
,可以在Bash 4中使用**
进行递归,但是“参数列表太长”消息是可能的)。请注意,命令的${1}
部分表示脚本或函数的第一个参数。您可能需要使用${d}
或其他变量或参数规范,或确保在$1
@DennisWilliamson中传递参数,非常感谢您的分享。对于任何开始怀疑它为什么不起作用或我是唯一一个傻瓜的未来读者,请参阅此处,了解${1}的方式和原因
works:不适用于有空格的路径…您可以使用引号来克服这一问题…引号以某种方式起作用echo“$(basename“$(dirname“$pathname”)”