面對大量相片時,傳統手動整理、命名與修復既辛苦又耗時。透過兩支自動化 Shell 腳本與 AI 工具 CodeFormer,可以實現相片批次命名、縮圖、AI 修復、格式轉換與備份的一條龍作業,極大提升效率。
工作流程詳述
1. 匯入相片並命名資料夾
將拍攝好的相片傳入任意資料夾,並將該資料夾命名為「拍攝日期_分類+事件描述」,例如:
20251104_旅遊_阿里山
方便追蹤跟管理。
2. 自動命名相片(photorename2.sh)
運行 photorename2.sh,依據相片的 EXIF 資訊自動讀取拍攝時間(Image Created)和相機型號(Camera Model),再依照格式:
時分_相機型號_序號.副檔名
自動重命名相片檔案,例如:
1030_Canon_001.jpg
若照片缺少拍攝時間則用檔案的修改時間代替。命名後的檔案方便辨識該張照片的基本資訊。
3. 縮圖並 AI 修復(aiphoto2.sh)
運行 aiphoto2.sh,它會先呼叫 photorename2.sh 進行命名,再將照片依「最長邊1920像素」限制縮放,並呼叫 CodeFormer 進行人像修復、背景優化及彩色化等處理。
最後會將修復完的照片轉為 4K 解析度 JPG,90%壓縮率,以兼顧畫質與檔案大小。修復後會搬回原始資料夾並依「拍攝日期_分類+事件描述_時分_相機型號_序號」命名。
4. 原始相片壓縮保存
原始相片會集中移到一個子資料夾並壓縮打包,確保有完整原始備份且不占用過多空間。
5. 靈活使用
由於 CodeFormer AI 修復需要較多資源與時間,若不需精細處理,只執行 photorename2.sh 即可快速完成命名及匯整,保持 EXIF 資訊完整。
腳本內容詳列
photorename2.sh — 自動依拍攝時間、相機型號重新命名
#!/bin/bash
count=1
shopt -s nullglob
files=(*.jpg *.JPG *.jpeg *.JPEG *.png *.PNG *.tif *.TIF *.tiff *.TIFF)
for file in "${files[@]}"; do
# 取得 Camera Model
model=$(exiftags -c "$file" | grep "Camera Model" | awk -F': ' '{print $2}' | tr -d ' ')
# 取得 Image Created(格式類似 2024:09:10 10:00:32)
image_created=$(exiftags -i "$file" | grep "Image Created" | awk -F': ' '{print $2}')
# model 預設為 na
if [ -z "$model" ]; then
model="na"
fi
# 要取出時間 hhmm,若 image_created 無值則用檔案修改時間替代
if [ -z "$image_created" ]; then
time_hhmm=$(date -r "$file" +"%H%M")
echo "無 Image Created,使用檔案修改時間: $file -> $time_hhmm"
else
# 從 Image Created 字串取時間部分,再去掉冒號,只取前4字 hhmm
time_hhmm=$(echo "$image_created" | awk '{print $2}' | sed 's/://g' | cut -c1-4)
fi
seq=$(printf "%03d" $count)
ext="${file##*.}"
new_name="${time_hhmm}_${model}_${seq}.${ext}"
mv -i "$file" "$new_name"
echo "已重新命名: $file -> $new_name"
((count++))
done
aiphoto2.sh — 自動縮圖、AI修復並整理照片
#!/bin/bash
#依據時間、相機命名
photorename2.sh
USER_INPUT_DIR="$(pwd)"
CURRENT_DIR_NAME="$(basename "$USER_INPUT_DIR")"
# 新增:去除 _resize 字串的純目錄名稱
CLEAN_DIR_NAME="${CURRENT_DIR_NAME/_resize/}"
ORIGINAL_DIR="${USER_INPUT_DIR}/${CURRENT_DIR_NAME}_原始"
RESIZE_DIR="${USER_INPUT_DIR}/${CURRENT_DIR_NAME}_resize"
AI_OUTPUT_DIR="${USER_INPUT_DIR}/ai_${CURRENT_DIR_NAME}_resize"
mkdir -p "$ORIGINAL_DIR"
mkdir -p "$RESIZE_DIR"
echo "開始將 JPG/PNG 圖片縮放輸出到 $RESIZE_DIR ..."
shopt -s nullglob
for img in "$USER_INPUT_DIR"/*.{jpg,JPG,jpeg,JPEG,png,PNG}; do
filename=$(basename "$img")
convert "$img" -resize 1920x1920\> -quality 90 "$RESIZE_DIR/${filename%.*}.jpg"
done
shopt -u nullglob
echo "將目錄 $USER_INPUT_DIR 中所有非目錄檔案移動到 $ORIGINAL_DIR ..."
find "$USER_INPUT_DIR" -maxdepth 1 -type f ! -name "$(basename "$0")" -exec mv {} "$ORIGINAL_DIR/" \;
echo "切換到 $RESIZE_DIR 執行 aiphoto ..."
PROCESS_DIR="$RESIZE_DIR"
cd "$PROCESS_DIR" || { echo "無法切換到 $PROCESS_DIR"; exit 1; }
USER_HOME="$HOME"
TEMP_OUTPUT_DIR="$USER_HOME/aiphoto"
FINAL_OUTPUT_DIR="$PROCESS_DIR/ai_${CURRENT_DIR_NAME}"
mkdir -p "$TEMP_OUTPUT_DIR"
mkdir -p "$FINAL_OUTPUT_DIR"
cd "$HOME/CodeFormer"
source "$HOME/codeformer_env/bin/activate"
clear
echo "=============================================="
echo " CodeFormer 批次處理操作介面 "
echo "=============================================="
echo "原始圖片資料夾:$PROCESS_DIR"
echo "暫存輸出資料夾(使用者目錄):$TEMP_OUTPUT_DIR"
echo "最終輸出資料夾(原始目錄下):$FINAL_OUTPUT_DIR"
echo
echo "請選擇處理模式:"
echo " [1] 僅修復"
echo " [2] 利用 Real-ESRGAN 強化背景區域"
echo " [3] 以 Real-ESRGAN 進一步提升修復後的人臉細節"
echo " [4] 彩色化黑白或褪色照片"
echo " [5] 人臉修補(裁切並對齊的人臉)"
echo " [0] 離開程式"
read -p "請輸入選項數字(0-5,0離開): " choice
if [[ "$choice" =~ ^[1-3]$ ]]; then
read -p "請輸入權重值 (例如 0.7 或 1.0,建議 0.7~1.0): " weight
if ! [[ "$weight" =~ ^0*(\.([0-9]+))?$|^1(\.0*)?$ ]]; then
echo "錯誤:權重請輸入介於 0 與 1 之間的數字"
deactivate
exit 1
fi
fi
case $choice in
0)
echo "離開程式。"
deactivate
exit 0
;;
1)
echo "執行選項 1:僅使用權重 ${weight} 修復"
python inference_codeformer.py -w "$weight" --input_path "$PROCESS_DIR" --output_path "$TEMP_OUTPUT_DIR"
;;
2)
echo "執行選項 2:使用權重 ${weight} 並利用 Real-ESRGAN 強化背景區域"
python inference_codeformer.py -w "$weight" --bg_upsampler realesrgan --input_path "$PROCESS_DIR" --output_path "$TEMP_OUTPUT_DIR"
;;
3)
echo "執行選項 3:使用權重 ${weight} 並以 Real-ESRGAN 進一步提升修復後的人臉細節"
python inference_codeformer.py -w "$weight" --face_upsample --bg_upsampler realesrgan --input_path "$PROCESS_DIR" --output_path "$TEMP_OUTPUT_DIR"
;;
4)
echo "執行選項 4:彩色化黑白或褪色照片"
python inference_colorization.py --input_path "$PROCESS_DIR" --output_path "$TEMP_OUTPUT_DIR"
;;
5)
echo "執行選項 5:人臉修補(裁切並對齊的人臉)"
python inference_inpainting.py --input_path "$PROCESS_DIR" --output_path "$TEMP_OUTPUT_DIR"
;;
*)
echo "無效選項,請重新執行並選擇有效選項。"
deactivate
exit 1
;;
esac
if [ "$choice" -eq 4 ] || [ "$choice" -eq 5 ]; then
echo "搬移處理結果到最終資料夾 $FINAL_OUTPUT_DIR"
mv -v "$TEMP_OUTPUT_DIR"/* "$FINAL_OUTPUT_DIR"/
else
if [ -d "$TEMP_OUTPUT_DIR/final_results" ]; then
echo "搬移處理結果到最終資料夾 $FINAL_OUTPUT_DIR"
mv -v "$TEMP_OUTPUT_DIR/final_results/"*.png "$FINAL_OUTPUT_DIR"/
else
echo "找不到 $TEMP_OUTPUT_DIR/final_results 目錄,無法搬移結果"
fi
fi
echo "原始圖片保留於 $USER_INPUT_DIR ,處理結果已搬移至 $FINAL_OUTPUT_DIR"
deactivate
PARENT_DIR="$(dirname "$USER_INPUT_DIR")"
FINAL_OUTPUT_PARENT_DIR="${PARENT_DIR}/${CURRENT_DIR_NAME}"
mkdir -p "$FINAL_OUTPUT_PARENT_DIR"
echo "aiphoto 處理完成,開始轉換 $FINAL_OUTPUT_DIR 下的 png 檔案為 jpg,輸出至 $FINAL_OUTPUT_PARENT_DIR ..."
shopt -s nullglob
for pngimg in "$FINAL_OUTPUT_DIR"/*.png; do
filename=$(basename "$pngimg")
# 改用不含 _resize 的純目錄名稱做為前綴
newname="ai_${CLEAN_DIR_NAME}_${filename%.*}.jpg"
convert "$pngimg" -quality 90 "$FINAL_OUTPUT_PARENT_DIR/$newname"
done
shopt -u nullglob
echo "所有處理完成,結果已存放於 $FINAL_OUTPUT_PARENT_DIR"
# 刪除目錄_resize
rm -rf "$RESIZE_DIR"
# 壓縮目錄_原始成tgz,檔名為目錄_原始.tgz
tgz_file="${ORIGINAL_DIR}.tgz"
tar -czf "$tgz_file" -C "$USER_INPUT_DIR" "${CURRENT_DIR_NAME}_原始"
# 刪除目錄_原始
rm -rf "$ORIGINAL_DIR"
#結束音效
play -q /opt/finish.mp3
這兩支 Script 讓批次照片的整理與 AI 修復變得簡單又高效,適合大量相片管理的需求。 如需更深入腳本解析或運行流程說明,可隨時詢問!
留言
張貼留言