| 知乎专栏 |
目录
dirname 命令用于提取文件路径中的目录部分,即去掉最后一个斜杠及其后面的内容。
dirname [选项] 名称... dirname [选项]
常用选项:
-z, --zero - 输出以 NUL 结尾而非换行符
--help - 显示帮助信息
--version - 显示版本信息
提取文件路径的目录部分:
$ dirname /usr/bin/find /usr/bin $ dirname /etc/nginx/nginx.conf /etc/nginx $ dirname /var/log/ /var $ dirname /usr/local/bin/ /usr/local
处理多个路径参数:
$ dirname /usr/bin/find /etc/nginx/nginx.conf /var/log/syslog /usr/bin /etc/nginx /var/log
相对路径处理:
$ dirname ./bin/script.sh ./bin $ dirname ../data/file.txt .. $ dirname script.sh .
特殊路径处理:
$ dirname / / $ dirname file . $ dirname "" . $ dirname //usr//bin//find //usr//bin
在脚本中获取脚本所在目录:
#!/bin/bash # 获取脚本所在目录的绝对路径 SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) echo "脚本目录: $SCRIPT_DIR"
批量移动文件到上级目录:
for file in /tmp/logs/*.log; do
dir=$(dirname "$file")
mv "$file" "$dir/../"
done
创建目录结构:
file="/var/www/html/index.html" mkdir -p "$(dirname "$file")" touch "$file"
备份文件时保留目录结构:
src="/etc/nginx/nginx.conf" backup_dir="/backup/$(dirname "$src")" mkdir -p "$backup_dir" cp "$src" "$backup_dir/"
dirname 提取目录部分,basename 提取文件名部分,两者互补:
$ path="/usr/bin/find" $ dirname "$path" /usr/bin $ basename "$path" find # 组合使用 $ echo "目录: $(dirname "$path"), 文件: $(basename "$path")" 目录: /usr/bin, 文件: find
在 Bash 中可以使用参数展开实现 dirname 的功能:
path="/usr/bin/find"
# dirname 等价于
echo "${path%/*}" # 输出: /usr/bin
# basename 等价于
echo "${path##*/}" # 输出: find
# 特殊情况处理
path="file.txt"
echo "${path%/*}" # 输出: file.txt (不是 ".")
dirname "$path" # 输出: .
注意:参数展开在处理不含斜杠的路径时行为与 dirname 不同,dirname 会返回 "."。