dirname 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
dirname——文件与目录命令族(见文件与目录命令族)。它是 basename 的互补命令:一个取文件名,一个取目录。
dirname 从一个路径里去掉最后的文件名部分,返回其所在的目录路径。
一、基本用法
bash
dirname /home/user/docs/report.pdf # 输出 /home/user/docs
dirname /home/user/docs/ # 输出 /home/user
dirname report.pdf # 输出 . (当前目录)给完整路径,它返回去掉最后一段后的部分。如果只给了个裸文件名(没有
/),它认为文件在当前目录,于是返回.。结尾的/会被先处理掉再计算父目录,所以dirname /a/b/得到/a。
二、与 basename 配合拆解路径
bash
path=/var/log/nginx/access.log
dir=$(dirname "$path") # /var/log/nginx
file=$(basename "$path") # access.log
echo "文件 $file 在目录 $dir 里"这是最经典的搭配:一个拿目录、一个拿名字,把路径拆成两半分别使用。脚本里想"基于某个已知文件路径找到它的兄弟文件"时尤其好用。
三、定位脚本自身的资源目录
bash
#!/bin/bash
# 用 dirname 找到脚本所在目录,再基于它引用同目录资源
script_dir=$(cd "$(dirname "$0")" && pwd)
config="$script_dir/../conf/app.conf"这是部署脚本里的常用技巧:
$0是脚本路径,dirname "$0"拿到相对目录,再 cd 进去 pwd 转成绝对路径,这样无论用户从哪个目录调用脚本,都能稳定找到同包里的配置文件。注意cd ... && pwd是为了把相对路径规范化成绝对路径。
四、踩坑:多层级与符号链接
bash
# dirname 只做字符串裁剪,不解析符号链接
dirname /link/to/file # 输出 /link/to,不会解析 /link 指向的真实目录
dirname是纯文本路径运算,不关心文件是否真实存在、也不会跟随符号链接。如果需要"真实物理目录",得配合readlink -f(见readlink 命令详解)先解析再取目录。
五、实战:批量备份到源目录的兄弟文件夹
bash
for f in /srv/app/data/*.dat; do
d=$(dirname "$f")
cp "$f" "$d/backup/$(basename "$f").bak"
done一句话总结
dirname = 从路径取目录部分:返回去掉最后一段后的父目录;和 basename 互补拆路径;脚本里常用它定位自身资源目录(cd "$(dirname "$0")" && pwd)。它是纯字符串裁剪,不解析符号链接——要真实路径先过 readlink。