#!/bin/bash
# 检查参数数量
if [ $# -ne 2 ]; then
echo "用法: $0 <源图片目录> <目标图片目录>"
exit 1
fi
# 获取源目录和目标目录
SOURCE_DIR="$1"
TARGET_DIR="$2"
# 检查源目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
echo "错误: 源目录 '$SOURCE_DIR' 不存在"
exit 1
fi
# 检查目标目录是否存在,如果不存在则创建
if [ ! -d "$TARGET_DIR" ]; then
echo "目标目录 '$TARGET_DIR' 不存在,正在创建..."
mkdir -p "$TARGET_DIR"
if [ $? -ne 0 ]; then
echo "错误: 无法创建目标目录 '$TARGET_DIR'"
exit 1
fi
fi
# 确保2.0x和3.0x目录存在
mkdir -p "$TARGET_DIR/2.0x"
mkdir -p "$TARGET_DIR/3.0x"
# 保存原始IFS并设置新的IFS
OLDIFS="$IFS"
# 处理Ctrl+C信号
trap 'echo -e "\n程序被用户中断"; IFS="$OLDIFS"; exit 0' INT
echo "开始处理图片 (按Ctrl+C退出)"
echo "----------------------------------------"
# 处理单个图片的函数
process_single_image() {
local src_img="$1"
local tgt_img="$2"
local img_type="$3" # 1x, 2x, 3x
# 根据图片类型设置目标目录和处理后的目标文件名
if [ "$img_type" == "2x" ]; then
DEST_DIR="$TARGET_DIR/2.0x"
BASE_TARGET_IMG="${tgt_img/@2x/}"
elif [ "$img_type" == "3x" ]; then
DEST_DIR="$TARGET_DIR/3.0x"
BASE_TARGET_IMG="${tgt_img/@3x/}"
else
DEST_DIR="$TARGET_DIR"
BASE_TARGET_IMG="$tgt_img"
fi
# 确保目标目录存在
if [ ! -d "$DEST_DIR" ]; then
echo "创建目标目录: $DEST_DIR"
mkdir -p "$DEST_DIR"
if [ $? -ne 0 ]; then
echo "错误: 无法创建目标目录 '$DEST_DIR'"
return 1
fi
fi
# 检查目标文件是否已存在
if [ -f "$DEST_DIR/$BASE_TARGET_IMG" ]; then
if [ $REPLACE_MODE -eq 1 ]; then
echo "替换模式:删除已存在的文件 '$DEST_DIR/$BASE_TARGET_IMG'"
rm "$DEST_DIR/$BASE_TARGET_IMG"
if [ $? -ne 0 ]; then
echo "错误: 无法删除已存在的文件"
return 1
fi
else
echo "🔥错误: 目标文件 '$DEST_DIR/$BASE_TARGET_IMG' 已存在"
return 1
fi
fi
# 移动并重命名文件
mv "$SOURCE_DIR/$src_img" "$DEST_DIR/$BASE_TARGET_IMG"
if [ $? -eq 0 ]; then
echo "成功: '$SOURCE_DIR/$src_img' -> '$DEST_DIR/$BASE_TARGET_IMG'"
return 0
else
echo "错误: 移动文件失败"
return 1
fi
}
while true; do
# 交互式输入源图片和目标图片名称(使用分号分隔)
echo "请输入源图片名称和目标图片名称,用分号分隔 (例如: 源图片;目标图片;r): "
read INPUT
# 如果用户直接回车,退出循环
if [ -z "$INPUT" ]; then
break
fi
# 使用IFS分隔符正确读取输入
IFS=";" read -r SOURCE_BASE TARGET_BASE REPLACE_FLAG <<<"$INPUT"
# 恢复IFS
IFS="$OLDIFS"
# 如果目标名称为空,使用源文件名
if [ -z "$TARGET_BASE" ]; then
TARGET_BASE="$SOURCE_BASE"
echo "目标图片名称为空,将使用源图片名称: $SOURCE_BASE"
fi
# 检查是否启用替换模式
REPLACE_MODE=0
if [ "$REPLACE_FLAG" = "r" ]; then
REPLACE_MODE=1
echo "已启用替换模式:将覆盖已存在的文件"
fi
# 处理源文件名
SOURCE_BASE_NO_EXT="${SOURCE_BASE%.*}" # 移除扩展名
SOURCE_HAS_EXT=0
if [[ "$SOURCE_BASE" == *"."* ]]; then
SOURCE_HAS_EXT=1
fi
# 处理目标文件名
TARGET_BASE_NO_EXT="${TARGET_BASE%.*}" # 移除扩展名
TARGET_HAS_EXT=0
if [[ "$TARGET_BASE" == *"."* ]]; then
TARGET_HAS_EXT=1
fi
# 准备不同分辨率的源文件名
if [ $SOURCE_HAS_EXT -eq 1 ]; then
# 用户提供了后缀
SOURCE_1X="$SOURCE_BASE"
# 提取扩展名
SOURCE_EXT="${SOURCE_BASE##*.}"
SOURCE_BASE_ONLY="${SOURCE_BASE%.*}"
# 构造2x和3x文件名
SOURCE_2X="${SOURCE_BASE_ONLY}@2x.${SOURCE_EXT}"
SOURCE_3X="${SOURCE_BASE_ONLY}@3x.${SOURCE_EXT}"
else
# 用户没提供后缀,默认为png
SOURCE_1X="${SOURCE_BASE}.png"
SOURCE_2X="${SOURCE_BASE}@2x.png"
SOURCE_3X="${SOURCE_BASE}@3x.png"
fi
# 准备目标文件名
if [ $TARGET_HAS_EXT -eq 1 ]; then
TARGET_IMG="$TARGET_BASE"
# 构造带@2x和@3x的目标文件名
TARGET_EXT="${TARGET_BASE##*.}"
TARGET_BASE_ONLY="${TARGET_BASE%.*}"
TARGET_2X="${TARGET_BASE_ONLY}@2x.${TARGET_EXT}"
TARGET_3X="${TARGET_BASE_ONLY}@3x.${TARGET_EXT}"
else
TARGET_IMG="${TARGET_BASE}.png"
TARGET_2X="${TARGET_BASE}@2x.png"
TARGET_3X="${TARGET_BASE}@3x.png"
fi
# 处理状态标志,检查每种分辨率的文件是否存在
FOUND_ANY=0
# 处理1x图片
if [ -f "$SOURCE_DIR/$SOURCE_1X" ]; then
FOUND_ANY=1
process_single_image "$SOURCE_1X" "$TARGET_IMG" "1x"
fi
# 处理2x图片
if [ -f "$SOURCE_DIR/$SOURCE_2X" ]; then
FOUND_ANY=1
process_single_image "$SOURCE_2X" "$TARGET_2X" "2x"
fi
# 处理3x图片
if [ -f "$SOURCE_DIR/$SOURCE_3X" ]; then
FOUND_ANY=1
process_single_image "$SOURCE_3X" "$TARGET_3X" "3x"
fi
# 如果没有找到任何匹配的文件
if [ $FOUND_ANY -eq 0 ]; then
echo "错误: 未找到任何匹配的图片 ($SOURCE_1X, $SOURCE_2X, $SOURCE_3X)"
fi
# 重新设置IFS为分号,为下一次循环做准备
IFS=";"
echo "----------------------------------------"
done
# 恢复IFS
IFS="$OLDIFS"
echo "图片处理完成"
exit 0