basename 命令详解:从路径中提取文件名的实用技巧

Linux 命令 basename 可从完整路径中提取纯文件名,并支持同时去除扩展名,是 Shell 脚本自动化的基础工具。
`basename` 是 GNU coreutils 中的一个轻量级命令行工具,核心功能是从完整文件路径中剥离目录部分,返回最末端的文件名或目录名。它支持三种典型用法:直接提取文件名、获取路径末层目录名、以及在提取时同步去除指定的文件扩展名(只需在路径后追加后缀参数即可)。`basename` 几乎没有学习成本,在 Shell 脚本中常用于批量处理文件列表、动态构建输出路径和文件格式转换等场景。它与 `dirname` 互补,共同构成 Linux 路径字符串处理的基础工具组合。
在 Linux/Unix 系统中,处理文件路径是日常操作和脚本编写中的高频需求。GNU 核心工具集(coreutils)里的 basename 命令,专门用来从完整路径中剥离目录部分,只留下文件名或最末层目录名。它看似简单,却在自动化脚本中扮演着不可替代的角色。
basename 是做什么的
basename 的核心功能是「去除路径中的目录部分和后缀」,返回干净的文件名。它是 GNU coreutils 的标准组件,几乎所有 Linux 发行版都默认自带。
需要注意的是,basename 不能空手运行。如果直接在终端输入 basename 并回车而不带任何参数,会返回一个错误——它必须接收一个文件或目录的路径作为参数。
basename 与 dirname 是一对互补命令:dirname 返回路径中的目录部分,basename 返回末端的文件或目录名。两者均来自 POSIX 标准,意味着不仅 Linux,在 macOS、BSD 等 Unix 系的系统上也能使用,只是 macOS 自带的 BSD 版本与 GNU 版本在个别选项(如批量处理的 -a 标志)上存在细微差异。此外,Bash 和 Zsh 内置了等效的参数展开语法——${path##*/} 可实现与 basename 相同的效果,在性能敏感的循环场景中可省去额外的子进程开销,但可读性不如 basename 直观。
提取文件名的基本用法
最常见的场景是从一段冗长的路径中提取出文件名本身。比如给 basename 传入一个位于某 GitLab 仓库深处的 license 文件的完整路径:
basename /home/dt/repos/project/license
执行后,它会剥离掉所有目录层级,只返回 license 这一个文件名。

这种能力在脚本编写中尤其有用。写脚本时,我们经常会拿到一批带有完整路径的文件列表,但实际处理逻辑往往只需要文件名本身,而不需要那一长串目录前缀。basename 正好能高效完成这个「瘦身」工作。

对目录路径同样适用
basename 不仅能处理文件,也能处理目录路径。如果传入的是一串目录层级,它会返回最右侧的那个目录名,并剥离掉所有父级目录。
例如:
basename directory1/directory2/directory3
返回结果是 directory3。逻辑很直观:无论路径末端指向的是文件还是目录,basename 都取路径最末尾的那一段。

去除文件扩展名的小技巧
basename 有一个非常实用的进阶用法——在提取文件名的同时去掉扩展名。
假设主目录下有一个 shell 脚本 macho.sh,正常提取文件名的操作是:
basename /home/dt/macho.sh
这会返回带扩展名的 macho.sh。但如果你只想要不带扩展名的文件名,可以在路径后面加一个空格,再跟上要剥离的后缀:
basename /home/dt/macho.sh .sh
此时命令会返回 macho,.sh 部分被干净地去掉。

这个特性在批量重命名、生成日志文件名、或构建输出路径时特别方便——你可以基于源文件名生成同名但不同扩展名的目标文件。
何时使用 basename
basename 是一个功能专一的小工具,标志和选项极少,学习成本很低。它最能发挥价值的场景包括:
- Shell 脚本自动化:从文件列表中批量提取纯文件名
- 动态构建路径:结合
dirname等命令灵活拼接路径 - 文件重命名与转换:去掉旧扩展名后加上新的
如果想进一步了解它的完整用法和参数,可以在终端执行 man basename 查阅手册页。
在实际脚本中,basename 常与循环结合使用来批量处理文件。例如,将某目录下所有 .mp4 文件转换为 .mp3 时,可用 for f in /videos/*.mp4; do name=$(basename "$f" .mp4); ffmpeg -i "$f" "$name.mp3"; done 这样的写法。值得注意的是,当路径或文件名中含有空格时,务必用双引号包裹变量(如 "$f"),否则 Shell 会将空格误解为参数分隔符,导致脚本出错。这是使用 basename 时最常见的陷阱之一。
小结
basename 虽然简单,却是命令行工作流中一块可靠的基础拼图。掌握它的三种典型用法——提取文件名、获取末层目录、去除扩展名——就能在编写脚本时省去大量繁琐的字符串处理逻辑。对于经常在终端里打交道的开发者和运维人员来说,它是值得纳入常用工具箱的实用命令。
相关推荐

vLLM 发布 proto-v0.2.0:内部协议模块迭代
vLLM 项目发布 proto-v0.2.0 标签(vllm-proto 0.2.0),经 verified signature 签名并通过 PR #56538 CI 验证。本文解读该组件级版本发布的工程意义与安全实践。

MCP 2.0深度解析:无状态协议如何重塑AI Agent通信标准
MCP 2.0(Model Context Protocol)深度解析:从有状态到无状态的重大变革、extensions扩展机制、治理成熟化及未来agentic消息原语路线图。了解这一AI Agent通信标准如何演进。

GPT-6 Astra实测:一句提示词把伦敦变成3D游戏
GPT-6 Astra早期实测:测试者仅用几个提示词就把历史伦敦变成可玩的3D体素游戏,横跨中世纪到现代,模型还主动生成小地图。本文解析Astra的主动创造力及其产品意义。