使用 basename
命令(推荐)
功能:从完整路径中提取文件名(含扩展名)或移除扩展名。
语法:
basename [路径] [后缀] # 后缀用于移除扩展名
示例:
-
提取文件名(含扩展名)
basename /home/user/docs/report.txt # 输出:report.txt
-
移除扩展名
basename /home/user/docs/report.txt .txt # 输出:report
-
批量处理文件(结合循环)
for file in /path/*.jpg; do name=$(basename "$file" .jpg) echo "文件名: $name" done
使用Shell参数扩展
适用场景:在Shell脚本中直接操作变量,无需调用外部命令。
语法:
${变量##*/} # 从路径提取文件名(含扩展名) ${变量%.*} # 移除扩展名 ${变量%%.*} # 移除多重扩展名(如.tar.gz)
示例:
file_path="/var/log/apache2/error.log" echo "${file_path##*/}" # 输出:error.log echo "${file_path%.*}" # 输出:/var/log/apache2/error echo "${file_path##*.}" # 输出:log(仅提取扩展名)
使用 awk
命令
适用场景:处理复杂路径或批量文本提取。
示例:
-
从路径提取文件名
echo "/tmp/data/file.csv" | awk -F/ '{print $NF}' # 输出:file.csv
-
提取文件名(不含扩展名)
echo "/tmp/data/file.csv" | awk -F/ '{sub(/\..*/, "", $NF); print $NF}' # 输出:file
使用 find
+ -printf
选项
适用场景:递归搜索文件并直接输出文件名。
示例:
find /home/user/docs -type f -printf "%f\n" # %f 表示仅打印文件名# report.txt # image.png
使用 ls
结合管道(谨慎使用)
注意:ls
解析文件名可能遇到空格或特殊字符问题,建议仅在简单场景使用。
ls /path | awk '{print $1}' # 列出文件名(第一列)
常见问题解答
-
如何提取目录名?
使用dirname
命令:dirname /home/user/docs/report.txt # 输出:/home/user/docs
-
如何处理带空格的文件名?
所有命令中变量用双引号包裹:basename "/path/My Document.txt" # 正确
-
如何提取多个扩展名(如
.tar.gz
)?
使用双重参数扩展:file="archive.tar.gz" echo "${file%.*}" # 输出:archive.tar echo "${file%%.*}" # 输出:archive
总结建议
- 简单提取 → 用
basename
- 脚本内操作 → 用 参数扩展
- 批量处理 → 结合
find
或循环 - 避免解析错误 → 始终用引号包裹变量
引用说明基于 GNU Coreutils 文档(
basename
,dirname
)、Bash 手册(参数扩展)及 Linux 命令行工具标准实现,实践环境为 Ubuntu 22.04,所有命令均通过验证。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/7952.html