Bash脚本生成4位数字文件名:合并扫描图片目录遇阻求助
Bash实现扫描书籍左右页图片交替合并
问题背景
原本用Python能轻松完成的任务,现在想用Bash脚本实现:
- 两个目录
left和right分别存放书籍左右页扫描图,文件名是固定4位数字格式(如0003.jpg、4003.jpg),范围0001-9999.jpg - 需要按升序交替合并到新目录
output,新文件名格式为[1-19998].jpg - 当前卡在如何生成固定4位数字的文件名,原脚本中变量
j超过9后无法生成0010.jpg这类正确格式的文件名
原脚本问题点
原脚本中用000$j.jpg的方式生成文件名,当j≥10时会变成00010.jpg(5位数字),不符合要求。
解决方案:用printf生成固定位数数字
Bash中可以直接用printf "%04d" $j生成带前导零的4位数字,示例:
j=1→0001j=10→0010j=123→0123j=9999→9999
同时优化原脚本的几个细节:
- 更准确统计目录中的jpg文件数量,避免目录本身或其他文件干扰
- 提前创建
output目录,防止复制时出错 - 完善参数校验逻辑,增加错误退出机制
修改后的完整脚本
#!/bin/bash # 校验输入参数 if [ "$1" != "left" ] && [ "$1" != "right" ]; then echo "错误:参数必须是'left'或'right',指定合并的第一页所属目录" exit 1 fi # 创建output目录(如果不存在) mkdir -p output # 统计左右目录中的jpg文件数量 left_count=$(ls left/*.jpg 2>/dev/null | wc -l) right_count=$(ls right/*.jpg 2>/dev/null | wc -l) total_pages=$(( left_count + right_count )) # 设置起始偏移 if [ "$1" == "left" ]; then first_offset=0 else first_offset=1 fi j=1 for (( i=1; i<=total_pages; i++ )); do # 计算当前要取的目录(0=left,1=right) dir_flag=$(( (i - 1 + first_offset) % 2 )) if [ $dir_flag -eq 0 ]; then # 生成left目录的4位文件名 src_file="left/$(printf "%04d" $j).jpg" dest_file="output/$i.jpg" cp "$src_file" "$dest_file" else # 生成right目录的4位文件名 src_file="right/$(printf "%04d" $j).jpg" dest_file="output/$i.jpg" cp "$src_file" "$dest_file" (( j += 1 )) fi done echo "合并完成,共处理$total_pages页"
脚本说明
- 执行时需传入参数
left或right,指定合并后的第一页是左页还是右页 - 自动创建
output目录,无需手动提前创建 - 用
printf "%04d" $j精准生成4位带前导零的源文件名 - 按交替顺序复制文件到
output,新文件名从1.jpg开始递增
内容的提问来源于stack exchange,提问作者shea
相关产品推荐
相关产品推荐

