58 lines
2.2 KiB
Bash
58 lines
2.2 KiB
Bash
#!/bin/sh
|
||
|
||
# 检查是否提供了目录参数
|
||
if [ -z "$1" ]; then
|
||
echo "用法: $0 <目标目录>"
|
||
echo "例如: $0 /path/to/your/directory"
|
||
exit 1
|
||
fi
|
||
|
||
IMG_PROXY_URL=${IMG_PROXY_URL}
|
||
TARGET_DIR="$1"
|
||
|
||
# 检查目录是否存在
|
||
if [ ! -d "$TARGET_DIR" ]; then
|
||
echo "错误: 目录 '$TARGET_DIR' 不存在。"
|
||
exit 1
|
||
fi
|
||
|
||
echo "将在目录 '$TARGET_DIR' 下的文件中执行以下替换:"
|
||
echo "1. 'upload.chinaz.com' -> 'pic.chinaz.com'"
|
||
echo "2. 'https://pic.chinaz.com' -> '$IMG_PROXY_URL/?pp=https://pic.chinaz.com'"
|
||
|
||
# 定义替换规则
|
||
# 注意:
|
||
# - 第一个替换中的 '.' 需要转义,因为它在正则表达式中是特殊字符。
|
||
# - 第二个替换中的 '/' 在sed的s命令中是分隔符,所以我们需要使用其他分隔符,
|
||
# 例如 '#',或者对规则中的 '/' 进行转义。使用其他分隔符更清晰。
|
||
# - 替换的顺序很重要。先将 upload.chinaz.com 替换为 pic.chinaz.com,
|
||
# 这样新生成的 pic.chinaz.com 才能被第二条规则匹配并加上代理。
|
||
|
||
RULE1_OLD="upload\.chinaz\.com" # 转义 '.'
|
||
RULE1_NEW="pic.chinaz.com"
|
||
|
||
RULE2_OLD_SED_SAFE="https://pic\.chinaz\.com" # 使用 '#' 作为分隔符,所以不需要转义 '/',但 '.' 仍需转义
|
||
RULE2_NEW_SED_SAFE="$IMG_PROXY_URL/?pp=https://pic.chinaz.com" # URL中的'?'在替换部分不需要特殊处理
|
||
|
||
# 查找目录下的所有普通文件(排除目录和符号链接等)并执行替换
|
||
# 使用 -print0 和 xargs -0 来安全处理包含空格或特殊字符的文件名
|
||
# 或者使用 find ... -exec sed ... {} +
|
||
# 这里为了清晰,使用 find 和 while read 循环,同样能安全处理特殊文件名
|
||
|
||
find "$TARGET_DIR" -type f -print0 | while IFS= read -r -d $'\0' file; do
|
||
echo "正在处理文件: $file"
|
||
|
||
# 执行第一个替换
|
||
sed -i "s/$RULE1_OLD/$RULE1_NEW/g" "$file"
|
||
|
||
# 执行第二个替换 (使用 # 作为分隔符)
|
||
sed -i "s#$RULE2_OLD_SED_SAFE#$RULE2_NEW_SED_SAFE#g" "$file"
|
||
|
||
# 如果想在一个sed命令中完成,可以这样:
|
||
# sed -i -e "s/$RULE1_OLD/$RULE1_NEW/g" -e "s#$RULE2_OLD_SED_SAFE#$RULE2_NEW_SED_SAFE#g" "$file"
|
||
# 这样可以减少文件的读写次数,对于大文件或大量文件效率稍高。
|
||
# 为了代码可读性,分开写了。
|
||
|
||
done
|
||
|
||
echo "替换完成。" |