若欲使用此處的指令,請先自行確認指令的邏輯,或者針對複本進行轉換,如無把握執行結果,請透過副本執行或者使用測試檔案進行測試,若使用此處指令造成任何損失,本人一概不負責。
針對檔案生成驗證用雜湊
針對目前目錄的未生成雜湊的檔案生成 SHA256 雜湊
find . -maxdepth 1 -path "*.sha256" -prune -o -name "*" -type f -exec sh -c '[ ! -f "{}.sha256" ] && sha256sum "{}" | tee "{}.sha256" ' \;
透過 ffmpeg 對 FLAC 音訊檔案生成音訊 MD5
警告: 此方法對於位元深度在 16bit 以外的音訊,無法正確生成其雜湊值。
針對同一目錄下的每個單一音訊檔案 (FLAC) 生成 audiomd5:
find . -maxdepth 1 -path "*.audiomd5" -prune -o -name "*.flac" -type f -exec sh -c '[ ! -f "{}.audiomd5" ] && echo -n "{} Audio" | tee "{}.audiomd5" && ffmpeg -i "{}" -vn -f md5 - | tee -a "{}.audiomd5" ' \;
針對同一目錄下的每個單一音訊檔案 (FLAC) 生成 audiomd5,並整合成單一個 audiomd5 檔案:
[ ! -f "audiomd5" ] && echo "Audio MD5 Checksum: " | tee "audiomd5" && find . -maxdepth 1 -name "*.flac" -type f -exec sh -c 'echo -n "{} Audio" | tee -a "audiomd5" && ffmpeg -i "{}" -vn -f md5 - | tee -a "audiomd5" ' \;
透過 flac 套件批次驗證同一目錄下,FLAC 音訊檔案的 雜湊值 是否與檔案內紀錄之 雜湊值 相符
簡易: 針對同目錄下的 FLAC 音訊檔案進行完整性驗證。
find . -maxdepth 1 -name "*.flac" -exec sh -c 'flac --test "{}"' \;
針對同目錄下的 FLAC 音訊檔案進行完整性驗證,並將過程存至 ./flac_testlog_日期.log
:
currTime=`date +%Y%m%d%H%M%S` && echo -n "" | tee flac_testlog_${currTime}.log && echo ${currTime} > currTime && find . -maxdepth 1 -name "*.flac" -exec sh -c 'currTime=`cat currTime` ; flac --test "{}" 2>&1 | tee -a flac_testlog_${currTime}.log' \; ; rm currTime
針對目前目錄底下所有子目錄的 FLAC 音訊檔案進行完整性驗證,並將過程存至 ./flac_testlog_日期.log
:
currTime=`date +%Y%m%d%H%M%S` && echo -n "" | tee flac_testlog_${currTime}.log && echo ${currTime} > currTime && find . -name "*.flac" -exec sh -c 'currTime=`cat currTime` ; flac --test "{}" 2>&1 | tee -a flac_testlog_${currTime}.log' \; ; rm currTime
題外話:Cygwin 遇到 ”error while loading shared libraries” 缺失 DLL 檔案的修復紀錄
4817 2022-10-13 22:18:57 find . -maxdepth 1 -name "*.flac" -exec sh -c 'flac --test "{}"' \;
4818 2022-10-13 22:19:07 cygcheck flac
4819 2022-10-13 22:19:13 cygcheck --help
4821 2022-10-13 22:20:00 cygcheck -p cygFLAC-8.dll
4822 2022-10-13 22:20:14 apt-cyg install libFLAC8
4823 2022-10-13 22:20:27 find . -maxdepth 1 -name "*.flac" -exec sh -c 'flac --test "{}"' \;
4824 2022-10-13 22:20:33 cygcheck flac
4825 2022-10-13 22:20:53 cygcheck -p cygogg-0.dll
4826 2022-10-13 22:21:11 apt-cyg install libogg0
4827 2022-10-13 22:21:26 find . -maxdepth 1 -name "*.flac" -exec sh -c 'flac --test "{}"' \;
透過批次轉換圖片至特定格式
透過 cwebp (來自套件 libwebp)
cwebp 指令參考:
cwebp | WebP | Google Developers
WebP – Mac上使用cwebp,dwebp,webpmux工具
對於這些指令,您需要以下套件:
cwebp
(來自套件libwebp
)
轉換 JPG 為 WebP (透過 cwebp)
find . -maxdepth 1 -iname "*.jpg" -exec sh -c 'cwebp "{}" -progress -mt -q 90 -metadata all -o "{}.webp" ; rename '.jpg.webp' '.webp' "{}.webp" ; rename '.JPG.webp' '.webp' "{}.webp" ; [ ! -d ./CONV_ED_ORIGIN_JPG ] && mkdir -p ./CONV_ED_ORIGIN_JPG ; mv "{}" ./CONV_ED_ORIGIN_JPG/ ' \;
意思為:批次轉換目前目錄後綴 (副檔名) 為 JPG 的圖片,將目標轉換為 WebP,輸出品質 90、顯示進度、多執行緒、保留所有中繼資料;重新命名 .jpg.webp
為 .webp
(會有大小寫問題,請依狀況修改);然後確認 ./CONV_ED_ORIGIN_JPG
目錄是否存在,不存在則建立;並將原始來源檔案移動至 ./CONV_ED_ORIGIN_JPG
底下。
以下為各參數之意思:
cwebp
-lossless
: 啟用無損壓縮,-exact
對於具有完全透明區域的圖片,僅當使用該選項時,才會保留不可見的像素值(R/G/B 或 Y/U/V) 。-q float
: 在有損壓縮(預設)的情況下,指定品質,數值愈高,品質損失愈低。若指定無損壓縮-lossless
選項,則在不破壞的前提下進行壓縮,並依據指定的浮點數值決定壓縮比率,指定的值愈大,壓縮比率越大,相對的處理時間愈久。-z int
: 啟動無損lossless
壓縮模式,於 0-9 之間指定一個等級,指定等級愈高,壓縮比率越大,相對的處理時間愈久。推薦的預設值為-z 6
,此選項實際上是一些預先定義的品質和方法設定的快速方式。如果後續指定-q
或-m
選項,將導致此選項無效。-alpha_q int
: 指定 alpha (透明度) 通道的品質,如指定100
則為無損壓縮,指定較低的值將導致有損壓縮,預設值為100
。-noalpha
: 丟棄 alpha 通道-preset string
: 指定一組預先定義的參數以對應特定類型的來源檔案。可能的值為:default
,photo
,picture
,drawing
,icon
,text
.
由於-preset
覆蓋了其他參數的值(除了-q
),因此此選項最好按參數順序出現在第一位。-metadata string
: 複製中繼資料至輸出檔案,支援的值為 all, none, exif, icc, xmp,預設為 none-progress
: 顯示轉換進度條-short
: 列印簡短資訊-quiet
: 安靜模式-mt
: 情況允許時使用多執行緒-af
: 自動過濾,此指令將會花費時間來另外計算來最佳化過濾強度,來達到平衡的品質。-size int
: 指定檔案大小,編碼器會自動調整參數,來嘗試接近指定大小;不可與-psnr
同時使用-psnr float
: 指定 PSNR (單位 dB 分貝) ,編碼器會自動調整參數,來嘗試接近指定數值;不可與-size
同時使用
其餘請參考:cwebp | WebP | Google Developers
轉換 PNG 為 WebP (透過 cwebp)
find . -maxdepth 1 -iname "*.png" -exec sh -c 'cwebp "{}" -progress -mt -q 90 -metadata all -o "{}.webp" ; rename '.png.webp' '.webp' "{}.webp" ; rename '.PNG.webp' '.webp' "{}.webp" ; [ ! -d ./CONV_ED_ORIGIN_PNG ] && mkdir -p ./CONV_ED_ORIGIN_PNG ; mv "{}" ./CONV_ED_ORIGIN_PNG/ ' \;
透過 ImageMagick (會遺失 exif 等資訊,不推薦)
警告:會遺失 exif 資訊!
請考慮搭配 exiftool、webpmux,匯入 JPG 的 exif 資訊,至於使用方式,還未嘗試,暫時不提供。
exiftool 安裝參考:
wget https://exiftool.org/Image-ExifTool-12.34.tar.gz #取得套件
tar -zxvf Image-ExifTool-12.34.tar.gz #解封裝
cd Image-ExifTool-12.34/ #移動至原始碼目錄
perl Makefile.PL && make install #編譯與安裝
對於這些指令,您需要以下套件:
ImageMagick
轉換 JPG 為 WebP (透過 ImageMagick)
find . -maxdepth 1 -iname "*.jpg" -exec sh -c 'convert "{}" -quality 90 "{}.webp" ; rename ".jpg.webp" ".webp" *.webp ; rename ".JPG.webp" ".webp" *.webp ; [ ! -d ./CONV_ED_ORIGIN_JPG ] && mkdir -p ./CONV_ED_ORIGIN_JPG ; mv "{}" ./CONV_ED_ORIGIN_JPG/ ' \;
意思為:批次轉換目前目錄後綴 (副檔名) 為 JPG 的圖片,將目標轉換為 WebP;重新命名 .jpg.webp
為 .webp
(會有大小寫問題,請依狀況修改);然後確認 ./CONV_ED_ORIGIN_JPG
目錄是否存在,不存在則建立;並將原始來源檔案移動至 ./CONV_ED_ORIGIN_JPG
底下。
以下為各參數之意思:
ImageMagick
-quality
: 品質-define
: 在指令之後接上特定編碼器的指令-define webp:lossless=true, false
: 針對 WebP 輸出啟用或停用無損壓縮-flatten
: 平面化,預設將 Alpha 通道轉換為白色
(PNG 轉 JPEG 時使用,若要指定 Alpha 的色彩,請搭配-background color
選項)-alpha remove
: 捨棄 Alpha 通道,extract
選項代表輸出 Alpha 通道
(PNG 轉 JPEG 時使用,若要指定 Alpha 的色彩,請使用-background color
+-flatten
選項)-background color
: 將 Alpha 通道填上指定色彩
(PNG 轉 JPEG 時使用,搭配-flatten
以組合 Alpha 通道為單一平面)-resize
: 對轉換後的檔案改變尺寸,例如指定-resize 1920x1080
。
若想保持比例,自適應 (適應性) 其相對之寬度或高度,可以僅指定寬或高。
例如:-resize 1920x
為僅只定寬,高度自適應;-resize x1080
為僅指定高,寬度自適應。
轉換 PNG 為 JPG (透過 ImageMagick)
find . -maxdepth 1 -iname "*.png" -exec sh -c 'convert "{}" -quality 90 -flatten "{}.jpg" ; rename ".png.jpg" ".jpg" *.jpg ; rename ".PNG.jpg" ".jpg" *.jpg ; [ ! -d ./CONV_ED_ORIGIN_PNG ] && mkdir -p ./CONV_ED_ORIGIN_PNG ; mv "{}" ./CONV_ED_ORIGIN_PNG/ ' \;
以下為各參數之意思:
ImageMagick
-quality
: 品質-define
: 在指令之後接上特定編碼器的指令-flatten
: 平面化,預設將 Alpha 通道轉換為白色
(PNG 轉 JPEG 時使用,若要指定 Alpha 的色彩,請搭配 -background color 選項)-alpha remove
: 捨棄 Alpha 通道,extract
選項代表輸出 Alpha 通道
(PNG 轉 JPEG 時使用,若要指定 Alpha 的色彩,請使用-background color
+-flatten
選項)-background color
: 將 Alpha 通道填上指定色彩
(PNG 轉 JPEG 時使用,搭配-
以組合 Alpha 通道為單一平面)flatten
-resize
: 對轉換後的檔案改變尺寸,例如指定-resize 1920x1080
。
若想保持比例,自適應 (適應性) 其相對之寬度或高度,可以僅指定寬或高。
例如:-resize 1920x
為僅只定寬,高度自適應;-resize x1080
為僅指定高,寬度自適應。
有關於 PNG 轉 JPG 的 Alpha 通道問題,可參考:Convert PNG with transparency to JPG
其他應用:
轉換 JPG 與 PNG 為 WebP (透過 cwebp),並將轉換後的檔案集中移動至 ../WEBP/
find . -type f \( -iname "*.png" -o -iname "*.jpg" \) -exec sh -c 'cwebp "{}" -progress -mt -q 90 -metadata all -o "{}.webp" ; [ ! -d ../WEBP ] && mkdir -p ../WEBP ; mv "{}.webp" ../WEBP/;tmpFileName=`basename "{}"`; rename '.png.webp' '.webp' "../WEBP/${tmpFileName}.webp" ; rename '.PNG.webp' '.webp' "../WEBP/${tmpFileName}.webp" ; rename '.jpg.webp' '.webp' "../WEBP/${tmpFileName}.webp" ; rename '.JPG.webp' '.webp' "../WEBP/${tmpFileName}.webp" ' \;
以上指定將 JPG 與 PNG 轉為 WebP,並將轉換後的檔案集中移動至 ../WEBP/
轉換 JPG 與 PNG 為 WebP (透過 cwebp),將轉換後的檔案集中移動至 ../WEBP/,並針對轉換之檔案保留目錄結構,並複製未轉換檔案到目的地目錄。
if [ "$1" == "default" ] || [ "$1" == "photo" ] || [ "$1" == "picture" ] || [ "$1" == "drawing" ] || [ "$1" == "icon" ] || [ "$1" == "text" ] ; then cwebpPreset="-preset $1"; echo "您指定了最佳化選項: ${cwebpPreset}。"; else echo "您可以指定: default、photo、picture、drawing、icon、text。 依據設定檔最佳化轉換後的圖片。"; fi; sleep 1; currentDirName="$(basename "$(pwd)")"; mkdir -p "../${currentDirName}_WEBP"; if [ -f "./tmpConv2Webp" ] ; then rm -rf "./tmpConv2Webp"; mkdir -p "./tmpConv2Webp"; else mkdir -p "./tmpConv2Webp"; fi; find . -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.apng" \) | while read -r sourceFile; do dirName="$(dirname "$sourceFile")"; fileName="$(basename "$sourceFile")"; fileNameExt="${fileName##*.}"; fileNameNoExt="${fileName%.*}"; echo "轉換:${sourceFile} 到:../${currentDirName}_WEBP/${dirName}/${fileNameNoExt}.webp"; fileNameExtLower="$(echo "$fileNameExt" | tr '[:upper:]' '[:lower:]')"; if [ -f "./tmpConv2Webp/source.*" ] ; then rm -f "./tmpConv2Webp/source.*"; fi; cp "${sourceFile}" "./tmpConv2Webp/source.${fileNameExtLower}"; mkdir -p "../${currentDirName}_WEBP/${dirName}"; if [ "${fileNameExtLower}" == "png" ] ; then ffmpeg -i "./tmpConv2Webp/source.${fileNameExtLower}" 2>&1 < /dev/null | grep -q '^Input #[0-9]*, apng,'; apngChkStat=$?; if [ ${apngChkStat} -eq 0 ] ; then convMethod="ffmpeg"; else convMethod="cwebp"; fi; elif [ "${fileNameExtLower}" == "apng" ] ; then convMethod="ffmpeg"; elif [ "${fileNameExtLower}" == "jpg" ] || [ "${fileNameExtLower}" == "jpeg" ] ; then convMethod="cwebp"; fi; if [ "${convMethod}" == "ffmpeg" ] ; then ffmpeg -y -i "./tmpConv2Webp/source.${fileNameExtLower}" -quality 90 ${cwebpPreset} "./tmpConv2Webp/conved.webp" > /dev/null 2>&1 < /dev/null; runStat=$?; elif [ "${convMethod}" == "cwebp" ] ; then cwebp "./tmpConv2Webp/source.${fileNameExtLower}" ${cwebpPreset} -progress -mt -q 90 -metadata all -o "./tmpConv2Webp/conved.webp" > /dev/null 2>&1; runStat=$?; fi; if [ ${runStat} -gt 0 ] ; then echo "錯誤:轉換失敗!"; else mv "./tmpConv2Webp/conved.webp" "../${currentDirName}_WEBP/${dirName}/${fileNameNoExt}.webp"; echo "轉換成功!"; fi; rm -f "./tmpConv2Webp/source.${fileNameExtLower}"; done; find . -type f -not \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.apng" \) | while read -r sourceFile; do dirName="$(dirname "$sourceFile")"; mkdir -p "../${currentDirName}_WEBP/${dirName}"; cp "${sourceFile}" "../${currentDirName}_WEBP/${dirName}/"; done; rm -rf "./tmpConv2Webp";
儲存成 bash 腳本:
- 檔名:
conv2webp_orig_dirs.sh
cp conv2webp_orig_dirs.sh /usr/local/bin
複製到 bin 目錄chmod +x /usr/local/bin/conv2webp_orig_dirs.sh
以給予執行權限- 您可能需要使用
sudo
以提升至超級使用者權限
#!/bin/bash
if [ "$1" == "default" ] || [ "$1" == "photo" ] || [ "$1" == "picture" ] || [ "$1" == "drawing" ] || [ "$1" == "icon" ] || [ "$1" == "text" ] ; then
cwebpPreset="-preset $1"
echo "您指定了最佳化選項: ${cwebpPreset}。"
else
echo "您可以指定: default、photo、picture、drawing、icon、text。 依據設定檔最佳化轉換後的圖片。"
fi
sleep 1
# 取得目前位於之目錄名稱
currentDirName="$(basename "$(pwd)")"
# 建立轉換目標目錄
mkdir -p "../${currentDirName}_WEBP"
if [ -f "./tmpConv2Webp" ] ; then
rm -rf "./tmpConv2Webp"
mkdir -p "./tmpConv2Webp"
else
mkdir -p "./tmpConv2Webp"
fi
# 轉換 JPG 與 PNG 為 WEBP
## 存為陣列
### while 迴圈 透過行程替換取得 find 結果 直接讀取轉換
find . -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.apng" \) | while read -r sourceFile; do
# 取得目錄結構與檔案名稱
dirName="$(dirname "$sourceFile")"
fileName="$(basename "$sourceFile")"
fileNameExt="${fileName##*.}"
fileNameNoExt="${fileName%.*}"
echo "轉換:"
echo "${sourceFile}"
echo ""
echo "到:"
echo "../${currentDirName}_WEBP/${dirName}/${fileNameNoExt}.webp"
echo ""
# 轉換副檔名為小寫
fileNameExtLower="$(echo "$fileNameExt" | tr '[:upper:]' '[:lower:]')"
# 複製欲轉換檔案到暫存資料夾
if [ -f "./tmpConv2Webp/source.*" ] ; then
rm -f "./tmpConv2Webp/source.*"
fi
cp "${sourceFile}" "./tmpConv2Webp/source.${fileNameExtLower}"
# 於目的地目錄建立相關結構
mkdir -p "../${currentDirName}_WEBP/${dirName}"
if [ "${fileNameExtLower}" == "png" ] ; then
# 檔案是 PNG
ffmpeg -i "./tmpConv2Webp/source.${fileNameExtLower}" 2>&1 < /dev/null | grep -q '^Input #[0-9]*, apng,'
apngChkStat=$?
if [ ${apngChkStat} -eq 0 ] ; then
# 目標檔案是動畫
# 標記使用 ffmpeg
convMethod="ffmpeg"
else
# 目標檔案不是動畫
# 標記使用 cwebp
convMethod="cwebp"
fi
elif [ "${fileNameExtLower}" == "apng" ] ; then
# 檔案是 APNG
# 標記使用 ffmpeg
convMethod="ffmpeg"
elif [ "${fileNameExtLower}" == "jpg" ] || [ "${fileNameExtLower}" == "jpeg" ] ; then
# 檔案是 JPG
# 標記使用 cwebp
convMethod="cwebp"
fi
# 轉換到目的地
if [ "${convMethod}" == "ffmpeg" ] ; then
# 透過 ffmpeg 轉換
ffmpeg -y -i "./tmpConv2Webp/source.${fileNameExtLower}" -quality 90 ${cwebpPreset} "./tmpConv2Webp/conved.webp" > /dev/null 2>&1 < /dev/null
runStat=$?
elif [ "${convMethod}" == "cwebp" ] ; then
# 透過 cwebp 轉換
cwebp "./tmpConv2Webp/source.${fileNameExtLower}" ${cwebpPreset} -progress -mt -q 90 -metadata all -o "./tmpConv2Webp/conved.webp" > /dev/null 2>&1
runStat=$?
fi
# 判斷轉換狀態
if [ ${runStat} -gt 0 ] ; then
echo "錯誤:"
echo "轉換失敗!"
echo ""
echo ""
else
# 移動轉換完成檔案到目標資料夾
mv "./tmpConv2Webp/conved.webp" "../${currentDirName}_WEBP/${dirName}/${fileNameNoExt}.webp"
echo "轉換成功!"
echo ""
echo ""
fi
rm -f "./tmpConv2Webp/source.${fileNameExtLower}"
done
# 複製所有其他類型的檔案到 轉換目標目錄
find . -type f -not \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.apng" \) | while read -r sourceFile; do
dirName="$(dirname "$sourceFile")"
mkdir -p "../${currentDirName}_WEBP/${dirName}"
cp "${sourceFile}" "../${currentDirName}_WEBP/${dirName}/"
done
rm -rf "./tmpConv2Webp"
以上指定將 JPG 與 PNG 轉為 WebP,並將轉換後的檔案集中移動至 ../WEBP/,並針對轉換之檔案保留目錄結構,並複製未轉換檔案到目的地目錄。
將目前終端機所在的路徑下所有的 JPG & JPEG & JFIF & PNG 檔案複製到 ”../JPEG_FILENAME_FORMAT/” 中,並透過指定套件重新命名檔案為 Exif 中繼資料中所儲存的拍照時間:
參考:
Rename images to exif time: Make unique filenames
Copy files with renaming
How To Rename Multiple Photos and Videos Based on EXIF Data?
透過 exiv2:
對於這些指令,您需要以下套件:
exiv2
find . -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.jfif" -o -iname "*.png" \) -exec sh -c ' [ ! -d ../FILENAME_FORMAT/IMAGE_FILENAME_FORMAT ] && mkdir -p ../FILENAME_FORMAT/IMAGE_FILENAME_FORMAT ; tmpDirName=`dirname "{}"` ; tmpFileName=`basename "{}"` ; cp -a --backup=t "{}" "../FILENAME_FORMAT/IMAGE_FILENAME_FORMAT/" ; exiv2 -v -t -r '%Y_%m_%d__%H_%M_%S' -F "../FILENAME_FORMAT/IMAGE_FILENAME_FORMAT/${tmpFileName}" ' \;
以上指定將 JPG, JPEG, JFIF, PNG 檔案複製到 ../JPEG_FILENAME_FORMAT/ 中,複製過程中有重複檔名時保留目標副本,並透過 exiv2 將檔名轉換為 Exif 中繼資料中所儲存的拍照時間,無 Exif 中繼資料之圖檔將保留原名稱,cp 複製時重複檔名問題透過 –backup=t 重新命名舊檔案解決。
透過 exiftool:
對於這些指令,您需要以下套件:
exiftool
find . -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.jfif" -o -iname "*.png" \) -exec sh -c ' [ ! -d ../FILENAME_FORMAT/IMAGE_FILENAME_FORMAT ] && mkdir -p ../FILENAME_FORMAT/IMAGE_FILENAME_FORMAT ; tmpDirName=`dirname "{}"` ; tmpFileName=`basename "{}"` ; cp -a --backup=t "{}" "../FILENAME_FORMAT/IMAGE_FILENAME_FORMAT/" ; exiftool "-FileName<CreateDate" -d %Y_%m_%d__%H_%M_%S%%-c.%%e "../FILENAME_FORMAT/IMAGE_FILENAME_FORMAT/${tmpFileName}" ' \;
以上指定將 JPG 與 JPEG 檔案複製到 ../JPEG_FILENAME_FORMAT/ 中,複製過程中有重複檔名時保留目標副本,並透過 exiftool
將檔名轉換為 Exif 中繼資料中所儲存的拍照時間,無 Exif 中繼資料之圖檔將保留原名稱,cp 複製時重複檔名問題透過 –backup=t 重新命名舊檔案解決。
請注意不要重複複製,要重新執行時,請移動或移除之前的重新命名檔案,避免造成檔案重複問題。
針對相機 RAW (DNG) 檔重新命名:
find . -type f \( -iname "*.dng" \) -exec sh -c ' [ ! -d ../FILENAME_FORMAT/RAW_FILENAME_FORMAT ] && mkdir -p ../FILENAME_FORMAT/RAW_FILENAME_FORMAT ; tmpDirName=`dirname "{}"` ; tmpFileName=`basename "{}"` ; cp -a --backup=t "{}" "../FILENAME_FORMAT/RAW_FILENAME_FORMAT/" ; exiftool "-FileName<CreateDate" -d %Y_%m_%d__%H_%M_%S%%-c.%%e "../FILENAME_FORMAT/RAW_FILENAME_FORMAT/${tmpFileName}" ' \;
針對視訊檔案的重新命名:
find . -type f \( -iname "*.mov" -o -iname "*.mp4" \) -exec sh -c ' [ ! -d ../FILENAME_FORMAT/VIDEO_FILENAME_FORMAT ] && mkdir -p ../FILENAME_FORMAT/VIDEO_FILENAME_FORMAT ; tmpDirName=`dirname "{}"` ; tmpFileName=`basename "{}"` ; cp -a --backup=t "{}" "../FILENAME_FORMAT/VIDEO_FILENAME_FORMAT/" ; exiftool "-FileName<CreateDate" -d %Y_%m_%d__%H_%M_%S%%-c.%%e "../FILENAME_FORMAT/VIDEO_FILENAME_FORMAT/${tmpFileName}" ' \;
題外話:不分青紅皂白的將所有目錄下的檔案遞迴轉換成 webp (?) (使用針對相片最佳化的預設集 -preset photo
):
find . -type f -exec sh -c ' [ ! -d ../../PHOTO_CONV/TO_WEBP ] && mkdir -p ../../PHOTO_CONV/TO_WEBP ; tmpDirName=`dirname "{}"` ; tmpFileName=`basename "{}"` ; cwebp "{}" -preset photo -progress -mt -metadata all -o "../../PHOTO_CONV/TO_WEBP/${tmpFileName}.webp" ' \;
適合於上方範例中已重新命名並歸檔在一起的圖片檔,轉換成小巧的 webp,並使用針對相片最佳化的預設集 -preset photo
,並將轉換後的 webp 圖片檔案放置在 ../../PHOTO_CONV/TO_WEBP/
中。
統計相符的檔案數量
重新命名後,如想確認原始資料夾符合條件的檔案數量,與目標資料夾的檔案數量是否一致。
以下指令將列出原始資料夾符合條件的檔案數量:
參考:
【Linux】計算資料夾下的檔案數 作者:辛西亞.Cynthia
find . -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.jfif" \) | wc -l
題外話:排除特定條件的檔案,並統計除排除之外的所有目前目錄與子目錄的檔案
find . \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.jfif" \) -prune -o -type f -print | wc -l
轉換 MPEG-4 檔案為 H.265 (AMD)
find . -maxdepth 1 -iname '*h265*' -prune -o -iname '*.mp4' -exec sh -c 'ffmpeg -i "{}" -c:v hevc_amf -c:a copy -quality quality -rc vbr_peak -min_qp_p 20 -max_qp_p 35 -min_qp_i 20 -max_qp_i 35 -profile_tier high -preanalysis true "{}_h265.mp4" && rename .mp4_h265 _h265 *.mp4 ' \;
意思為:無視帶有 h265 關鍵字檔名的檔案,並批次轉換目前目錄後綴 (副檔名) 為 MP4 的視訊,將目標轉換為 h265 (amd 硬體編碼器) 格式的 mp4 容器,使用 hevc amf 視訊編碼器、音訊複製原始軌道、編碼品質設定為品質模式、速率控制模式設定為變動位元速率(VBR_PEAK)、最小(品質好)P影格(差異影格)設定為20、最大(品質差)P影格為35、最小I影格(關鍵影格)為20、最大I影格為35、配置檔案層設定為高、啟用預先分析;重新命名 .mp4_h265
為 _h265
(會有大小寫問題,請依狀況修改) 。
find . -maxdepth 1 -iname '*h265*' -prune -o -iname '*.mp4' -exec sh -c 'ffmpeg -i "{}" -c:v hevc_amf -c:a copy -quality quality -rc vbr_peak -min_qp_p 25 -max_qp_p 40 -min_qp_i 25 -max_qp_i 40 -profile_tier high -preanalysis true "{}_h265.mp4" && rename .mp4_h265 _h265 *.mp4 ; [ ! -d ./CONV_ED_ORIGIN_VIDEO ] && mkdir -p ./CONV_ED_ORIGIN_VIDEO ; mv "{}" ./CONV_ED_ORIGIN_VIDEO/ ' \;