Linux技巧:介绍从目录路径获取文件名和目录前缀的方法
ahcoder 2024-12-19 11:15 29 浏览
本篇文章介绍下面三个内容:
- 使用 dirname 命令获取路径名的目录部分
- 使用 basename 命令获取路径名的文件名部分
- 使用 bash 的参数扩展获取文件名的后缀名
使用 dirname 命令获取路径名的目录部分
在 Linux 中,可以使用 dirname 命令获取路径名的目录部分,不包含路径名最后的文件名。
查看 man dirname 的说明如下:
dirname [OPTION] NAME...
dirname - strip last component from file name.
Output each NAME with its last non-slash component and trailing slashes removed;
if NAME contains no /'s, output '.' (meaning the current directory).
即,dirname 命令可以获取所给路径名的目录部分,也就是从最后一个 ‘/’ 字符往前的部分,不包括 ‘/’ 字符自身。
如果所给的路径名没有包含 ‘/’ 字符,返回的目录部分是点号 ‘.’,认为是当前目录。
所给的路径名参数不要求是真实存在的路径,dirname 只是对所给的路径名字符串进行处理。
dirname 命令可以提供多个路径名参数,默认会逐行打印每个路径名的目录部分。
如果不想换行打印,可以使用 -z 选项,该选项的说明如下:
-z, --zero
separate output with NUL rather than newline
具体举例如下:
$ dirname app/Phone.apk src/lib/utils.c
app
src/lib
$ dirname utils.c
.
$ dirname -z app/Phone.apk src/lib/utils.c
app src/lib $
可以看到,dirname app/Phone.apk src/lib/utils.c 命令逐行打印了所给两个路径名的目录部分。
dirname utils.c 命令的路径名参数没有包含 / 字符,打印的目录部分是点号 ‘.’。
dirname -z app/Phone.apk src/lib/utils.c 使用 -z 选项指定在获取到的目录部分后面不要加换行符,那么打印结果都在同一行上,没有换行。打印结果最后的 $ 字符是命令行提示符。
使用 basename 命令获取路径名的文件名部分
在 Linux 中,可以使用 basename 命令获取路径名的文件名部分,不包含文件名前面的目录路径。
查看 man basename 的说明如下:
basename NAME [SUFFIX]
basename OPTION... NAME...
basename - strip directory and suffix from filenames.
Print NAME with any leading directory components removed.
If specified, also remove a trailing SUFFIX.
即,basename 命令可以获取所给路径名的文件名部分,也就是从最后一个 ‘/’ 字符往后的部分,不包括 ‘/’ 字符自身。
当只提供一个路径名参数时,后面可以提供一个可选的 SUFFIX 参数,该参数指定去掉文件名的后缀部分。
basename 默认只处理一个路径名参数。
如果想要处理多个路径名参数,需要使用 -a 选项,该选项的说明如下:
-a, --multiple
support multiple arguments and treat each as a NAME
当使用 -a 选项指定提供多个路径名参数时,basename 会逐行打印每个路径名的文件名部分。
如果不想换行打印,可以再使用 -z 选项,该选项的说明如下:
-z, --zero
separate output with NUL rather than newline
当提供多个路径名参数时,如果想指定去掉文件名的后缀部分,需要用 -s 选项,该选项的说明如下:
-s, --suffix=SUFFIX
remove a trailing SUFFIX
具体举例说明如下:
$ basename src/lib/utils.c
utils.c
$ basename src/lib/utils.c .c
utils
$ basename -s .c src/lib/utils.c
utils
$ basename -a src/lib/utils.c src/main.c
utils.c
main.c
$ basename -a -s .c src/lib/utils.c src/main.c
utils
main
$ basename -a -z src/lib/utils.c src/main.c
utils.c main.c $
可以看到,basename src/lib/utils.c 命令获取到所给路径名的文件名部分,也就是 utils.c。
basename src/lib/utils.c .c 命令指定从获取到的文件名中去掉 .c 后缀,返回 utils。
而 basename -s .c src/lib/utils.c 命令通过 -s .c 指定从获取到的文件名中去掉 .c 后缀,要在 -s 选项后面提供去掉的文件名后缀部分。
basename -a src/lib/utils.c src/main.c 命令使用 -a 选项指定处理多个路径名,可以避免后面的文件名被当成 SUFFIX 参数,获取到的多个文件名会逐行打印。
basename -a -s .c src/lib/utils.c src/main.c 命令通过 -a 选项指定处理多个路径名,通过 -s .c 指定从获取到的文件名中去掉 .c 后缀。
basename -a -z src/lib/utils.c src/main.c 命令通过 -a 选项指定处理多个路径名,通过 -z 选项指定获取到的文件名部分后面不要加换行符,那么打印结果都在同一行上,没有换行。打印结果最后的 $ 字符是命令行提示符。
使用 bash 的参数扩展获取文件名的后缀名
在 bash 中,可以使用参数扩展(parameter expansion)表达式来获取文件名的后缀名。
具体说明如下:
${filename##*.}
这个表达式在 filename 变量值中匹配 ‘.’ 这个字符,一直到最后一次匹配为止,然后返回该字符后面的部分,也就是文件名的后缀名,不包含 ‘.’ 这个字符。
注意:${filename##*.} 这个表达式是 bash 的参数扩展表达式,filename 会被当成变量名处理,获取该变量值以便进行参数扩展。
它不能直接处理字符串,filename 不会被当成字符串处理,必须把字符串赋值给变量,然后把变量名放到该表达式中进行处理。
具体举例如下:
$ echo ${src/lib/utils.c##*.}
$ filename="src/lib/utils.c"
$ echo ${filename##*.}
c
$ filename="utils.c"
$ echo ${filename##*.}
c
$ filename="utils.1.c"
$ echo ${filename##*.}
c
$ echo '.'${filename##*.}
.c
$ filename="util"
$ echo ${filename##*.}
util
可以看到,echo ${src/lib/utils.c##*.} 命令输出为空。这里没有把 src/lib/utils.c 当成要处理的字符串,而是当成变量名。当前没有这个变量,变量值为空,匹配结果也为空。
当把 "src/lib/utils.c" 赋值给 filename 变量后,echo ${filename##*.} 命令打印出 filename 变量值对应字符串的后缀名,也就是 c,没有包含 . 这个字符。
修改 filename 变量值为 "utils.c",echo ${filename##*.} 命令也打印了对应的后缀名。
把 filename 变量赋值为 "utils.1.c",包含多个 ‘.’ 字符,${filename##*.} 表达式会一直匹配到最后一个 ‘.’ 字符,并返回该字符后面的部分。
由于这个表达式获取的后缀名不包含 ‘.’ 字符,如果需要加上 ‘.’ 字符,可以在表达式前面主动加上这个字符。
例如,'.'${filename##*.} 这个写法会在表达式返回值前面加上 ‘.’ 字符。
要注意的是,当所给变量值中没有包含 ‘.’ 字符时,这个表达式会返回变量值自身。修改 filename 变量值为 "util",echo ${filename##*.} 命令打印了这个变量值自身。
当 ${filename##*.} 返回的值等于 $filename 的值时,说明 filename 变量值不包含 ‘.’ 字符,也就是不带有后缀名。
相关推荐
- linux服务器--PVE(一)简介及安装(pve安装ifupdown2)
-
1.PVE(ProxmoxVirtualEnvironment)简介ProxmoxVirtualEnvironment基于debian,是一个完整的、开源的企业虚拟化服务器管理平台。它在一个平...
- 手把手教你!如何在 Linux 服务器中搭建 Sentinel 环境?
-
你在Linux服务器上搭建Sentinel环境时,是不是也遇到过各种报错,要么是启动失败,要么是配置后无法正常访问控制台?看着同事顺利搭建好,自己却一头雾水,别提多着急了!其实,很多互联网大厂...
- Linux高性能服务器技术总结(linux高性能服务器编程怎么样)
-
1服务器简介服务器是提供计算服务的设备,由于服务器需要响应用户请求,因此在处理能力、稳定性、安全性、可扩展性、可管理性等方面提出了较高要求。随着虚拟化技术的进步,云服务器(ECS)已经快速的在...
- 从 0 到 1:使用 Ansible 自动化运维 Linux 服务器全流程
-
Ansible是一款强大的IT自动化工具,广泛用于服务器配置管理、软件部署和任务自动化。本文将带你从零开始,学习如何使用Ansible对Linux服务器进行自动化运维,涵盖Ansibl...
- 诡异!Win11 “此电脑” 莫名现 Linux 图标,啥情况?
-
我这电脑出了个怪事儿,“此电脑”下面莫名其妙多了个Linux的图标,可我压根儿就没装过Linux系统啊!琢磨了一下,估计是系统可选功能里那个“适用于Linux的Windows子系统”插件搞的鬼。实例系...
- Linux基础运维篇:Linux 终端与 Shell 基础(第006课)
-
一、啥是终端?先搞懂「人和电脑对话的窗口」你可以把终端(Terminal)理解成一个「文字版的电脑操作台」。在Windows里,类似「命令提示符」或PowerShell;在Linux里,...
- 2025罗技大师系列智「简」大赛-罗技大师系列-MX KEYS S键盘评测
-
在2025罗技大师系列智「简」大赛中,MXKEYSS键盘凭借其卓越的设计与智能化体验,成为众多创作者的理想之选。本篇文章将深入评测这款键盘的核心功能、使用体验及创新亮点,帮助你了解它如何提升...
- Linux编辑命令vim(linux使用vim编辑文件)
-
1、vi编辑器简介vim是一个全屏幕纯文本编辑器,是vi编辑器的增强版,我们主要讲解的是vim编辑器。可以利用别名让输入vi命令的时候,实际上执行vim编辑器,例如:#定义别名...
- 全选是ctrl加什么?全选的快捷键是什么介绍
-
如何高效使用「全选」快捷键(Ctrl+A/A)提升工作效率在日常电脑操作中,"全选"是最基础却至关重要的功能之一。无论您是文字工作者、程序员还是普通用户,掌握全选快捷键都能极大提升操作...
- Linux命令大全(linux命令大全书)
-
个人博客:https://chunyu.work/文章较长,可以收藏备用常用快捷键(1)ctrl+c:停止进程(2)ctrl+l:清屏(3)善于用tab键(4)上下键:查找执行过的命令文件目录类(...
- Xshell是做什么用的?Xshell使用教程分享
-
Xshell是一款功能强大的终端模拟器,支持SSH1,SSH2,SFTP,TELNET,RLOGIN和SERIAL。通过提供业界先进的性能,Xshell包含了其他SSH客户端无法发现的功能和优势,作为...
- Java 开发者线上问题排查常用的 15 个 Linux 命令
-
作为Java开发者,线上环境的问题排查是日常工作的重要组成部分。熟练掌握Linux命令能大幅提升排查效率,快速定位进程异常、日志错误、性能瓶颈等核心问题。本文结合Java应用特点,整理1...
- Linux的常用命令就是记不住,怎么办?
-
1.帮助命令1.1help命令#语法格式:命令--help#作用:查看某个命令的帮助信息#示例:#ls--help查看ls命令的帮助信息#netst...
- 别再乱学 Linux 了!这 5 个核心技巧,让你效率飙升 10 倍!
-
在Linux学习的漫漫长路上,不少人犹如在黑暗中摸索的行者,四处碰壁,学习效果却不尽如人意。你是不是也曾在海量的Linux知识面前迷失方向,感觉自己投入了大量时间,却收效甚微?其实,掌握Li...
- Linux终端神器Terminator时隔1年回归,2.1.5新版发布
-
IT之家5月23日消息,科技媒体linuxiac今天(5月23日)发布博文,报道称Terminator在沉寂一年后,最新发布了2.1.5版本,在分割终端窗格时支持克隆SSH...
- 一周热门
- 最近发表
-
- linux服务器--PVE(一)简介及安装(pve安装ifupdown2)
- 手把手教你!如何在 Linux 服务器中搭建 Sentinel 环境?
- Linux高性能服务器技术总结(linux高性能服务器编程怎么样)
- 从 0 到 1:使用 Ansible 自动化运维 Linux 服务器全流程
- 诡异!Win11 “此电脑” 莫名现 Linux 图标,啥情况?
- Linux基础运维篇:Linux 终端与 Shell 基础(第006课)
- 2025罗技大师系列智「简」大赛-罗技大师系列-MX KEYS S键盘评测
- Linux编辑命令vim(linux使用vim编辑文件)
- 全选是ctrl加什么?全选的快捷键是什么介绍
- Linux命令大全(linux命令大全书)
- 标签列表
-
- linux 远程 (37)
- u盘 linux (32)
- linux 登录 (34)
- linux 路径 (33)
- linux 文件命令 (35)
- linux 是什么 (35)
- linux 界面 (34)
- 查看文件 linux (35)
- linux 语言 (33)
- linux代码 (32)
- linux 查看命令 (33)
- 关闭linux (34)
- root linux (33)
- 删除文件 linux (35)
- linux 主机 (34)
- linux与 (33)
- linux 函数 (35)
- linux .ssh (35)
- cpu linux (35)
- 查看linux 系统 (32)
- linux 防火墙 (33)
- linux 手机 (32)
- linux 镜像 (34)
- linux ip地址 (34)
- linux 用户查看 (33)