首页/系统/Linux 运维命令速查/dirname 取路径中的目录部分
文件与目录76 条

dirname 取路径中的目录部分

从完整路径中取目录段,与 basename 相反;脚本里切换到自己所在目录的经典组合。

Linux 运维命令速查系统更新于 2026-10-13

dirname 是什么

dirname 从路径中取出目录部分,与 basename 正好相反。它的价值主要在脚本里:让自己能定位到脚本文件所在目录,从而正确读取同目录下的配置与资源,也常用于把配置项里的路径拆成目录段后再拼接。

基本信息

适用平台Linux / Unix,GNU coreutils 实现
命令语法dirname 路径...
常用选项-z 以 NUL 分隔输出,便于处理含换行的路径
相关命令basename 取文件名、readlink -f 解析软链接后的绝对路径

典型使用场景

  • 脚本内定位自身目录:cd "$(dirname "$0")" 是最常见的自举写法
  • 拆分路径再拼接:从配置项中取出目录段后追加文件名,避免手工字符串切分
  • 生成输出路径:把目标文件路径的目录段取出,作为同目录的输出位置
  • 处理命令行参数:对用户传入的相对路径先规整出目录段再做校验
  • 与 basename 配对:一个取目录一个取文件名,是路径处理的基础组合

常用示例

常用示例
dirname /etc/nginx/nginx.conf    # /etc/nginx
dirname justfile                 # .(无目录段时输出点号)
dirname /var/log/                # /var(结尾斜杠被忽略)
cd "$(dirname "$0")"              # 切到脚本自身所在目录
SELF=$(readlink -f "$0"); DIR=$(dirname "$SELF")   # 先解析软链接再取目录
base=$(basename "$CONF"); dir=$(dirname "$CONF")

输入输出对照

输入输出说明
/etc/nginx/nginx.conf/etc/nginx常规情况
justfile.无目录段时输出点号
/var/log//var结尾斜杠被忽略
//根目录返回自身
a/ba相对路径按相对形式返回
输出为点号时含义是当前目录,脚本里直接 cd 进去会依赖调用位置,配合 readlink -f 先转绝对路径更稳。
dirname 只做字符串处理,既不检查路径是否存在,也不解析软链接,行为完全可预测。
需要同时处理多个路径时可以直接传入多个参数,输出顺序与输入参数一一对应,便于在循环里逐条消费。
用 $0 取脚本路径时,软链接调用与经 PATH 调用都可能给出非预期值,先 readlink -f 解析再 dirname。

易错点

  • 对纯文件名执行 dirname 输出点号而不是空串,脚本拼接路径时要注意这个点号
  • 路径含软链接时 dirname 不会解析,得到的可能是链接所在目录而非真实目录,需要先 readlink -f
  • 含空格的路径不加引号会被拆成多个参数,dirname 只处理第一段,变量务必用双引号包裹
  • 空字符串输入同样输出点号,会让后续路径意外指向当前目录,处理用户输入前先校验非空

数据来源与参考

  • man 1 dirname(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌