使用tiffcp合并TIF文件并自动命名及Bash字符截取求助
解决多页TIF批量合并与文件名截取问题
一、用Bash快速截取文件名最后4个字符
在Bash里,有两种简单的方式可以帮你去掉文件名的最后4个字符,生成新的目标文件名:
按位置精准截取:
假设你把文件名存在变量里,比如filename="myfile1234.tif",用${filename:0:-4}就能直接得到去掉最后4位的部分,再加上.tif就是最终的多页TIF文件名:filename="myfile1234.tif" new_name="${filename:0:-4}.tif" echo $new_name # 输出 myfile.tif这里
0代表从文件名开头算起,-4表示停在倒数第4个字符之前,逻辑非常直观。按模式匹配删除:
如果你想确保只删掉末尾任意4个字符,也可以用%操作符(从末尾删除最短匹配的模式):filename="myfile1234.tif" new_name="${filename%????}.tif" echo $new_name # 同样得到 myfile.tif????就像通配符,匹配任意4个字符,直接把文件名最后4位删掉。
二、批量合并TIF的正确姿势(避开Bash错误)
我猜你可能是直接用tiffcp *.tif output.tif导致的参数错误?如果是要按前缀分组合并(比如report_0001.tif和report_0002.tif合并成report_.tif),可以试试下面的批量脚本,能完美避开常见的Bash解析问题:
第一步:先找出所有要生成的目标文件名
先遍历当前目录下所有TIF文件,提取去掉最后4个字符的前缀,去重后就得到每个多页TIF的基础名:
# 提取所有唯一的前缀(去掉最后4个字符) prefixes=$(for file in *.tif; do echo "${file:0:-4}"; done | sort -u)
第二步:循环合并每组文件
对每个前缀,找到所有匹配的原文件,用tiffcp合并成目标文件:
for prefix in $prefixes; do # 匹配所有以该前缀开头、后面跟4个字符的TIF文件 source_files="${prefix}????.tif" target_file="${prefix}.tif" # 执行合并命令,记得加双引号避免空格解析错误 tiffcp "$source_files" "$target_file" echo "合并完成:$target_file" done
常见错误解决
如果运行时碰到tiffcp报错,比如参数太多、文件名解析失败,可以试试这些办法:
- 文件名带空格:一定要给变量加双引号,不然Bash会把空格当成参数分隔符,直接导致命令执行失败;
- 没有匹配的文件:加个判断逻辑,避免空参数传给
tiffcp:if compgen -G "$source_files" > /dev/null; then tiffcp "$source_files" "$target_file" echo "合并完成:$target_file" else echo "没找到匹配的文件:$source_files" fi
三、完整可运行的脚本
把上面的内容整合起来,保存成merge_tifs.sh,给它加执行权限就能直接用了:
#!/bin/bash # 先检查当前目录有没有TIF文件 if ! compgen -G "*.tif" > /dev/null; then echo "当前目录没有TIF文件哦!" exit 1 fi # 提取所有唯一的前缀 prefixes=$(for file in *.tif; do echo "${file:0:-4}"; done | sort -u) # 循环处理每个前缀的文件 for prefix in $prefixes; do source_files="${prefix}????.tif" target_file="${prefix}.tif" if compgen -G "$source_files" > /dev/null; then tiffcp "$source_files" "$target_file" echo "✅ 成功合并为:$target_file" else echo "⚠️ 没有找到匹配的文件:$source_files" fi done echo "所有合并操作搞定啦!"
使用方法很简单:
chmod +x merge_tifs.sh ./merge_tifs.sh
内容的提问来源于stack exchange,提问作者ppr
相关产品推荐
相关产品推荐

