[memo] find 應用
若欲使用此處的指令,請先自行確認指令的邏輯,或者針對複本進行轉換,如無把握執行結果,請透過副本執行或者使用測試檔案進行測試,若使用此處指令造成任何損失,本人一概不負責。
針對檔案生成驗證用雜湊
針對目前目錄的未生成雜湊的檔案生成 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 . -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/,並針對轉換之檔案保留目錄結構。
find . -iname "*.png" -o -iname "*.jpg" -exec sh -c 'cwebp "{}" -progress -mt -q 90 -metadata all -o "{}.webp" ; [ ! -d ../WEBP ] && mkdir -p ../WEBP ; tmpDirName=`dirname "{}"` ; tmpFileName=`basename "{}"` ; mkdir -p "../WEBP/${tmpDirName}" ; mv "{}.webp" "../WEBP/${tmpDirName}/" ; rename '.png.webp' '.webp' "../WEBP/${tmpDirName}/${tmpFileName}.webp" ; rename '.PNG.webp' '.webp' "../WEBP/${tmpDirName}/${tmpFileName}.webp" ; rename '.jpg.webp' '.webp' "../WEBP/${tmpDirName}/${tmpFileName}.webp" ; rename '.JPG.webp' '.webp' "../WEBP/${tmpDirName}/${tmpFileName}.webp" ' \;
以上指定將 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}" ' \;
統計相符的檔案數量
重新命名後,如想確認原始資料夾符合條件的檔案數量,與目標資料夾的檔案數量是否一致。
以下指令將列出原始資料夾符合條件的檔案數量:
參考:
【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/ ' \;