这是文件路径的示例:
/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt
Run Code Online (Sandbox Code Playgroud)
我想得到的是文件基名:
VMN CRTro.txt
Run Code Online (Sandbox Code Playgroud)
所以我尝试以下操作:
echo /isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt | sed s'/\// /g' | awk '{print $NF}'
CRTro.txt <-- not as expected
Run Code Online (Sandbox Code Playgroud)
或者
basename /isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt
basename: extra operand `Doma'
Try `basename --help' for more information. <-- basename cant handle spaces
Run Code Online (Sandbox Code Playgroud)
获取包含空格的文件的基本名称的最佳方法是什么?
小智 18
只引用你的路径
basename "/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt"
Run Code Online (Sandbox Code Playgroud)
phe*_*mer 11
问题的核心是引用。没有引号,它将文件名视为basename.
如果路径是硬设置的,而不是变量,那么 rob 的答案是好的。但是,如果这是使用变量的脚本的一部分,则有两个很好的解决方案:
$ filepath="/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt"
$ basename "$filepath"
VMN CRTro.txt
Run Code Online (Sandbox Code Playgroud)
然而,它basename是一个外部实用程序,而不是 bash 的一部分。bash 中内置了一个替代解决方案:
$ filepath="/isf/GCM/VPfig/Aas/AR/ClCo el Doma Republic/VMN CRTro.txt"
$ echo "${filepath##*/}"
VMN CRTro.txt
Run Code Online (Sandbox Code Playgroud)
的${filepath##*/}是告诉bash执行水珠*/,这尽可能多的字符可能后跟一个相匹配/,然后剥离出来。