basename 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
basename——文件与目录命令族(见文件与目录命令族)。脚本里要把/a/b/c.tar.gz变成c.tar.gz或c时,它比手写字符串截取省心。
basename 从一个路径里取出最后的文件名部分,去掉前面的目录层级;还能顺手去掉你指定的后缀。
一、基本用法
bash
basename /home/user/docs/report.pdf # 输出 report.pdf
basename /home/user/docs/ # 输出 docs(结尾 / 被忽略)
basename /home/user/docs/report.pdf .pdf # 输出 report(去掉指定后缀)第一个用法最常见:给个绝对/相对路径,它吐出最后的名字。第二个参数(可选后缀)会做精确匹配并截掉——
report.pdf去掉report。结尾的/会被自动抹掉,所以basename /a/b/得到b而不是空。
二、在脚本循环里拆解文件名
bash
for path in /data/*.log; do
name=$(basename "$path" .log) # 去掉 .log 后缀
echo "处理 $name"
gzip < "$path" > "/archive/$name.log.gz"
done配合 dirname 可以分别拿到"文件名"和"所在目录",做重命名、归档、批量转换时用得非常多。上面这个循环把每个
.log压成.log.gz并存到另一目录,文件名主体保持不变。
三、多后缀处理
bash
# 只去掉一个后缀;要链式去多个得嵌套或换别的工具
bn=$(basename "$f")
echo "${bn%.*}" # bash 参数展开也能去后缀,basename 主要负责去目录
basename的"去后缀"只能去一次、且必须精确匹配结尾。如果你要处理.tar.gz这种复合后缀,更灵活的是用 shell 自身的${var%.*}展开,或者 sed。basename 的长处始终是"路径 → 文件名"这一步。
四、踩坑:空格与特殊字符
bash
# 路径含空格时务必加引号
basename "$my path/file.txt" # 正确
basename $my path/file.txt # 错误:被拆成多个参数和所有路径处理命令一样,变量展开后如果含空格或通配符,必须加双引号,否则会被 shell 拆成多个参数导致结果错乱。
五、实战:批量重命名日志
bash
for f in /var/log/app/*.log; do
base=$(basename "$f" .log)
mv "$f" "/var/log/app/archive/$base.$(date +%F).log"
done相关命令
一句话总结
basename = 从路径取文件名:默认去掉目录部分拿到最后一段,第二个参数可精确去掉指定后缀;脚本里常和 dirname 配合拆解路径。路径含空格务必加引号。复合后缀处理不如 shell 自身的 ${var%.*} 灵活。