日常排查日志、批量处理文件、脚本自动化时,我们经常会遇到完整文件路径:/opt/logs/2026/access.log、/data/upload/demo.pdf。如果手动切割路径提取文件名比较麻烦,用sed/awk写复杂正则容易出错,linux自带 basename命令就是专门用来剥离路径、只输出文件名的原生工具,简单高效,适配日志解析、批量脚本、日志清洗等各类运维场景。
一、basename基础语法
1、baseame的基础格式
basename [完整路径] [后缀名]basename的主要作用:
1.自动剔除前置目录,只输出文件名称 ;
2.支持直接删除文件后缀,只保留主文件名。
#只提取文件名basename /var/log/nginx/access.log#提取文件名并删除后缀.logbasename /var/log/nginx/access.log .log#仅传入文件名(无路径),原样输出basename txtbak20251221.tar.gz

#用awk+basename提取批量提取文件名#读取日志最后一列路径,循环提取文件名awk '{print $4}' log.txt | while read filepath; do basename "$filepath"; done

#只提取文件名,不需要后缀awk '{print $4}' log.txt | while read f; do basename $f .${f##*.}; done

tail -f log.txt | awk '{print $4}' | xargs -I {} basename {}#以文件目录在第四列为例
#循环打印目录下所有文件名for file in /data/*; do basename "$file"; done

find输出完整路径,配合basename只拿文件名:
#递归查找所有.log文件,输出纯文件名find /data -name "*.log" | xargs -I {} basename {}

场景 3:使用脚本批量重命名文件
#!/bin/bashpath="/data/ceshi"for file in "$path"/*.pdfdo[ -f "$file" ] || continuename=$(basename "$file" .pdf)mv -- "$file" "$path/${name}.txt"done

#提取双引号内路径,引号包裹避免空格截断awk -F'"' '{print $2}' log.txt | while read f; do basename "$f"; done#双引号\"做分隔符,路径是第二列即$2

#单个文件,仅输出没有后缀的文件,不会修改原文件basename 123.jpg .jpg#批量处理日志文件,只保留文件名find /data/ceshi/ -type f -name "*.log" | while read -r f; do basename "$f" .log; done


basename是运维容易忽略但实用性极强的系统命令,相比sed、awk正则切割路径,拥有零正则、兼容特殊路径、适配脚本自动化三大优势。如果你觉得文章对你的运维工作有帮助,记得点赞加关注。后附几个常用命令:1.日志提取所有文件,去重排序,具体路径在那列以实际为准awk '{print $4}' app.log | while read -r f; do basename "$f"; done | sort -u > file_list.txt2.统计日志内每个文件出现次数,路径在最后一列awk '{print $4}' app.log | while read -r f; do basename "$f"; done | sort | uniq -c3.递归查找指定后缀文件,输出纯文件名find /data/upload -type f -name "*.pdf" | while read -r f; do basename "$f"; done
