在Unix中从完整路径获取文件名

60
我正在尝试使用Unix命令从/this/is/could/be/any/path/abc.txt中获取"abc.txt"。请注意,/this/is/could/be/any/path是动态的。

有任何想法吗?

4个回答

88

bash 中:

path=/this/is/could/be/any/path/abc.txt

如果你的路径中有空格,把它用"包起来。

path="/this/is/could/be/any/path/a b c.txt"

然后要提取路径,使用basename函数

file=$(basename "$path")
或者
file=${path##*/}

1
file=${path##*/}ksh 中同样适用;实际上,bash 从 ksh 借鉴了这个特性。任何 Linux 系统上的 sh 也可能支持此功能。 - sorpigal
2
应将其用双引号括起来,以避免文件名中的奇怪字符问题:file="$(basename $path)"file="${path##*/}" - Keith Thompson
你的回答很好,但如果设计师想让脚本能够处理包含空格的路径,第一个答案需要在 $path 周围加上引号,如下:file=${basename "$path"}。我已经编辑了答案以修复这个问题,但我认为它需要你的批准。@Keith Thompson,file="${basename $path}" 是不行的,引号需要放在 $path 上,否则 basename 函数将无法正常工作。 - thebunnyrules
这真的很有用,basename 也可以删除文件扩展名。 - Merlin

6

basename path 返回路径结尾处的文件名。

编辑:

值得注意的是,常见的做法是在命令周围使用反引号,例如 `basename ...`,这样UNIX shell会执行该命令并返回其文本值。

因此,要将basename的结果赋给一个变量,可以使用以下命令:

x=`basename ...path...`

并且$x将是文件名。


1
我已经尝试过这个,basename 似乎在名称中有空格的路径上出现了问题。 - TimGJ

2
您可以使用basename /this/is/could/be/any/path/abc.txt

2
关注时间...回答于2012年4月12日13:15与2012年4月12日13:16 - tonymarschall

2
您可以使用dirname命令。
$ dirname $path

这与 OP 所要求的相反:dirname any/path/abc.txt -> any/path,而他们所要求的是abc.txt - Marcono1234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接