最常用、最可靠的方法是使用 dirname 命令;它符合 POSIX 标准,能正确处理末尾斜杠、相对路径等边界情况,而 basename 提取的是文件名而非目录名。

在 Linux Shell 中,提取文件路径的目录名(即去掉最后一级文件名,只保留其所在目录路径),最常用、最可靠的方法是使用内置命令 dirname。
用 dirname 提取目录名
dirname 是 POSIX 标准命令,专为解析路径而设计,能正确处理各种边界情况(如末尾斜杠、单/双点、空路径等)。
- 基本用法:
dirname /home/user/file.txt→ 输出/home/user - 路径末尾带斜杠也安全:
dirname /var/log/→ 输出/var(注意:不是/var/log,因为log/被视为目录名,dirname取其父目录) - 相对路径同样适用:
dirname ./src/main.c→ 输出./src - 想得到绝对路径?可组合
realpath:realpath "$(dirname ./relative/path.txt)"
用参数扩展(Bash/Zsh 内置)避免外部命令
如果追求极致效率或脚本中需避免调用外部命令,可用 Bash 的 参数扩展,但要注意它只是字符串操作,不校验路径是否存在或规范性。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
- 去除最后一个
/及之后部分:path="/a/b/c.txt"; echo "${path%/*}"→/a/b - 处理末尾斜杠:
path="/a/b/"; echo "${path%/}"先去尾部斜杠,再"${path%/*}",或一步写成"${path%/}"; echo "${path%/*}" - 更健壮的写法(兼容无斜杠路径):
dir="${path%/*}"; [[ "$dir" = "$path" ]] && dir="." ; echo "$dir"(当路径不含/时,返回当前目录.)
常见误区提醒
别用 basename —— 它提取的是文件名(最后一级),不是目录名。
-
basename /home/user/file.txt→file.txt(这是反方向) - 别用
cut -d'/' -f1-$(($(echo "$path" | tr -cd '/' | wc -c)))这类复杂管道——易出错、不可读、不跨平台 - 避免直接字符串截取如
${path:0:-$((${#path}-$(basename "$path" | wc -c)-1))}—— 逻辑混乱且无法处理..或.
实际脚本小技巧
常配合变量赋值和条件判断使用:
dir=$(dirname "$filepath"); cd "$dir" || exit 1- 确保路径合法:
[[ -d "$dir" ]] || { echo "目录不存在: $dir"; exit 1; } - 获取上两级目录:
parent2=$(dirname "$(dirname "$filepath")")

















