百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

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...