dirname提取路径目录部分,basename提取文件名部分;二者posix兼容、语义明确,适合生产脚本;也可用${}展开替代但可读性稍弱。

dirname 和 basename 是 Shell 中处理路径最基础也最可靠的两个命令,不依赖外部工具、无需正则、 POSIX 兼容,适合写进任何生产脚本。
dirname:专注提取路径部分
它只做一件事:去掉路径中最后一个 / 及其右边的内容,返回左边的目录部分。无论输入是否带尾部斜杠、是否为相对路径,行为都一致。
- /usr/bin/vim → /usr/bin
-
/etc/ → /(注意不是
/etc) - log.txt → .(表示当前目录)
- ./src/main.c → ./src
basename:专注提取名称部分
它剥离所有前导路径,只留下最后一段;还可选地删掉指定后缀,但必须**精确匹配**整个后缀字符串。
- /var/log/syslog → syslog
- config.ini → config.ini
- script.sh + 后缀 .sh → script
-
data.tar.gz + 后缀 .tar.gz → data(需完整写出
.tar.gz)
组合使用:还原路径结构
二者常成对出现,尤其在脚本开头定位自身位置或批量处理文件时。
- 获取当前脚本所在目录:
cd "$(dirname "$0")" - 提取文件名并去掉扩展名:
name=$(basename "$file" .log) - 构造新路径:
newpath="$(dirname "$old")/backup/$(basename "$old" .bak)"
替代方案提醒:${} 参数展开更轻量
若仅需简单切分,Shell 内置的变量展开更快且无进程开销:
-
${path##*/}等价于basename "$path" -
${path%/*}等价于dirname "$path" -
${file%.*}可去最后一个点后的后缀(比 basename 更灵活)
不过 basename 和 dirname 语义明确、可读性高,协作或长期维护的脚本中仍推荐优先使用。











