[Mac] 用 NConvert 和 Exiftool 依照 EXIF 資料將相片批次轉正與更名
很久以前在 Windows 上有用 AutoIt 寫一個 AutoPhotoCopy 的小工具,
用來將記憶卡上的相片根據 EXIF 的資料,先旋轉至正確方向後,
再把檔案名稱改成日期的格式後,移動至日期的目錄下好作整理~
不過現在都改用 Mac 了,原本的程式不能跑在 Mac 上,
於是決定在 Mac 上用 shell script 寫個簡易版的 AutoPhotoCopy for Mac~
要寫這個 shell script,還是需要兩樣工具來輔助才行,
一個是根據 EXIF 方向資料來將相片轉正的工具,
一個是根據 EXIF 日期資料來將相片重新命名的工具~
找了一下,Mac 上有 NConvert 和 ExifTool 可以用~
參考資料:How to automatically rotate images based on EXIF data?
1. 使用 NConvert 將相片轉正
先到 NConvert 的網頁下載給 Mac 用的 NConvert for OS X,
我下載的是 NConvert 6.17 for OS X (x86)~
抓下來是個 .tgz 檔案,將它解開在一個目錄下:
cd ~/Software/Multimedia/
tar zxvf ~/Downloads/NConvert-macosx.tgz
接著建立一個 symbolic link 到 /usr/local/bin/ 目錄下,
這樣在任意目錄下都能執行 nconvert 了:
cd /usr/local/bin
sudo ln -s /Users/testuser/Software/Multimedia/NConvert/nconvert ./
要將相片依照 EXIF 的方向資料轉正,可以下 -jpegtrans exif 選項,
另外加上 -overwrite 選項直接覆蓋原本的相片檔:
nconvert -jpegtrans exif -overwrite *
2. 使用 ExifTool 將相片檔重新命名
先用 Homebrew 安裝 Exiftool:
brew install exiftool
接著執行下面的指令,就能將 photo_src_folder 下的相片檔,
依照 EXIF 中記錄的日期時間,搬移並改名,
例如 2016/2/21 10:52 PM 拍的照片,就會變成 2016/[2016.02.21] xxx/20160221_105200.jpg~
這樣就能自動將相片先依年份、再依日期分到不同目錄,
而目錄名稱先取為 xxx 的目的是之後可以改名成更有意義的名稱 (像台大散步之類的):
exiftool -P -r "-FileName<CreateDate" -d "%Y/[%Y.%m.%d] xxx/%Y%m%d_%H%M%S%%-c.%%e" photo_src_folder
完整的 AutoPhotoCopy for Mac 原始碼如下,有興趣的人可以參考一下囉,
它會先確定 NConvert 和 ExifTool 都已經裝好,
然後去 /Volumes 目錄下找 DCIM 這個目錄
(如果有插記憶卡進來的話,相片應該會在 /Volumes/記憶卡名稱/DCIM 目錄下),
接著將 DCIM 目錄下的每張相片都先轉正後更名,搬移到最終的儲存目錄 (DST_FOLDER) 去:
#!/bin/sh DST_FOLDER=/Volumes/MyFlashDisk/Photos check_bin() { # $1 = bin if ! which "$1" >/dev/null 2>/dev/null; then echo "Cannot find $1, please install it first." exit fi } # Check for requirement check_bin nconvert check_bin exiftool # Check for dst folder if [ ! -d "${DST_FOLDER}" ]; then echo "Destination folder ${DST_FOLDER} not exist. Please attach hard drive." exit fi for SRC_FOLDER in $(find /Volumes -maxdepth 3 -type d -name DCIM) do # Rotate files find "${SRC_FOLDER}" -iname "*.jpg" -exec nconvert -jpegtrans exif -overwrite {} \; # Rename files exiftool -P -r "-FileName<CreateDate" -d "${DST_FOLDER}/%Y/[%Y.%m.%d] xxx/%Y%m%d_%H%M%S%%-c.%%e" "${SRC_FOLDER}" done echo "Done!"