[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 時使用,搭配 -flatten以組合 Alpha 通道為單一平面)
  • -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/ ' \;
Huán-Hsüān Lín (WordPressLocal)
Huán-Hsüān Lín (WordPressLocal)
文章: 19