linux 在Bash中获取文件路径参数中的最后一个目录名/文件名

cnjp1d6j  于 2023-05-28  发布在  Linux
关注(0)|答案(5)|浏览(539)

我正在尝试为SVN写一个post-commit钩子,它托管在我们的开发服务器上。我的目标是尝试将提交项目的副本自动 checkout 到服务器上托管该项目的目录。但是,我需要能够读取传递给脚本的目录字符串中的最后一个目录,以便 checkout 到我们的项目所在的同一个子目录。
例如,如果我向项目“example”提交一个SVN,我的脚本会获取“/usr/local/svn/repos/example”作为它的第一个参数.我需要从字符串的末尾去掉“example”,然后用另一个字符串连接它,这样我就可以 checkout 到“/server/root/example”,并立即看到更改。

oxf4rvwz

oxf4rvwz1#

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

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

rfbsl7qr2#

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

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

输出:

c
b
a
uklbhaso

uklbhaso3#

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

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

这使用了Bash的参数扩展来移除最后一个(剩余的)斜杠之前的字符串部分。

41zrol4v

41zrol4v4#

若要在不使用外部命令的情况下打印文件名,
运行:

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

此命令的运行速度必须比basenamedirname快。

lmyy7pcs

lmyy7pcs5#

如果文件在当前目录中,您将邀请此短:

cd /dev/shm
basename $(pwd) # shm

我已经有了这个sed命令,尽管我承认它不是很实用:

path="/dev/shm"
sed -r "s/^.*\/(.*)$/\1/" <<< $path # shm

相关问题