解像度で画像を並び替える
ファイルの回復が完了し、リカバリ後のタスクスクリプトの助けを借りて画像を復元したら、画像を解像度でソートすると良いでしょう。これにより、撮影した写真、ウェブカメラの画像、またはその他の画像を、解像度が同じ関連画像が多いフォルダにソートできます。
画像に関する情報を収集する
collect-info-about-images.sh
#!/bin/bash if [ 'XX' != 'XX'"$1" ]; then if [ -f "$1" ]; then # mime part start IsIt=$(file "$1" --mime-type -b); NeedImageOnly="ItIs_"${IsIt/'/'*/} if [ "$NeedImageOnly" == "ItIs_image" ] ; then # mime part end ImageInfoFEH=($(feh -l "$1")) IfDamaged=${?} ImageType=${ImageInfoFEH[9]} Height=${ImageInfoFEH[11]} Width=${ImageInfoFEH[10]} if [ "$IfDamaged" != '0' ]; then echo "$1" "Damaged" "${IfDamaged}"; fi; echo "$1"'|'W'|'$Width'|'H'|'$Height'|'Format'|'$ImageType'|'Errors'|'$IfDamaged'|' >> collect-info-about-images.txt # mime part start fi # mime part end else echo The « "$1" » is not a valid file name. fi else ScriptsName=${0##*/} find -type f -exec sh -e "./$ScriptsName" "{}" \; #find -type f -name "*.jpg" -o -name "*.gif" -o -name "*.png" -exec sh -e "./$ScriptsName" "{}" \; fi
$IfDamaged 変数は、feh によって返される終了ステータスコードを含みます。
また、pngcheckAUR をインストールして "PNG, JNG, MNG" の整合性をチェックし、および/または jpeginfoAUR をインストールし、$IfDamaged 変数のエラー出力を使用するか、破損したファイルを collect-info-about-images.txt
ファイルに追加しないようにスクリプトを変更できます。
pngcheckAUR のチェック結果のサンプル:
./f939799496.png invalid IDAT row-filter type (11) ./f939799496.png private (invalid?) IDAT row-filter type (236) (warning) ./f939799496.png private (invalid?) IDAT row-filter type (231) (warning) ./f939799496.png invalid IDAT row-filter type (49) ./f939799496.png zlib: inflate error = -3 (data error) ERROR: ./f939799496.png OK: ./f218842888.png (532x552, 32-bit RGB+alpha, non-interlaced, 95.8%).
jpeginfoAUR のチェック結果のサンプル:
f62152912.jpg 5678 x 2829 24bit Exif N 11625509 Corrupt JPEG data: 1074 extraneous bytes before marker 0xd9 [WARNING] f124619744.jpg 144 x 119 24bit JFIF N 5813 [OK]
スクリプト内の文字列から必要なデータを抽出するには、sed や gawk などの外部プログラムの代わりに、expressionを使用して、スクリプトの動作を少し高速化することが望ましいです。例えば、
AA="$(jpeginfo -c f62152912.jpg)"; ZZ="${AA/*' [OK]'/}"; if [ 'XX'"$ZZ" == 'XX' ]; then echo File is good'!!!'; fi
collect-info-about-images.sh スクリプトは、以下のパターンで画像に関するデータを生成します。
画像へのフルパス|幅|サイズ|高さ|サイズ|フォーマット|画像の種類|エラー|feh による終了コード|
サンプル: Images/f269351998.bmp|W|40|H|39|Format|bmp|Errors|0|
解像度別に画像を整理する
このスクリプトは、解像度に基づいてフォルダを作成します。各フォルダにどれだけのファイルが含まれるべきか、基本のファイルタイプ名のフォルダにどれだけのサブディレクトリが含まれるべきかについて制限を設定できます。制限に達すると、新しい順序の番号がディレクトリ名に追加されて作成されます。非常に多くのファイルがある場合、すべてのファイルを1つのフォルダにオーバーロードしないように、基本の宛先変数 IfExist="${Destination}/
の後に、独自のカウンタを追加して新しいサブフォルダを作成することもできます。ただし、引用符 " が全体の宛先パスの始まりと終わりにあることに注意してください。画像の数が限られたフォルダを閲覧する方がはるかに簡単であり、サムネイルの読み込みがはるかに速くなり、お気に入りのフォルダ番号/名前を覚えて追加するのが簡単になります。
#!/bin/bash NumberOfBaseDir="0" SubDirNumber="0" CountAll="0" NumDir="0" echo Creating destination. Destination="./SortedImages" echo mkdir -v "${Destination}" -p echo Created destination with status: $? echo Your set of limitations. SDN=50; echo Limit files in a subdir: $SDN NBD=50; echo Limit subdirs in a file type named destination: $NBD SourceDataFile="collect-info-about-images.txt" echo Source file with a necessery data: $SourceDataFile if [ 'XX' == 'XX'"$SourceDataFile" ] ; then echo The '$SourceDataFile' variable is empty exit 1 else if [ ! -f "$SourceDataFile" ]; then echo The "$SourceDataFile" file doesn"'"t exist exit 2 fi; fi; echo Populating an array from a file ArrayFillCount=0; while read line ; do tmpWb="${line/|H|*/}"; W="${tmpWb/*W|/}"; tmpHb="${line/|Format|*/}"; H="${tmpHb/*|/}"; #if (( "$W" >= "800" )) && (( "$W" <= "1000" )); then #if (( "$H" >= "800" )) && (( "$H" <= "1000" )); then ArrayOfFiles[$ArrayFillCount]="$line"; ArrayFillCount=$((ArrayFillCount+1)) DupLimitKeeper[$W,$H]="0"; #fi;fi; done < $SourceDataFile; echo Done with extracting of necessary data about resolutions. echo Starting loop of restoration XX=${#ArrayOfFiles[@]} while [ "${XX}" != "${CountAl}l" ] ; do preType=${ArrayOfFiles[$CountAll]/*"|Format|"/}; ImageType=${preType/|*/} preW=${ArrayOfFiles[$CountAll]/*"|W|"/};Width=${preW/|*/};preH=${ArrayOfFiles[$CountAll]/*"|H|"/} Height=${preH/|*/}; PathToFile=${ArrayOfFiles[$CountAll]/"|"*/} DupLimitKeeper[Width,Height]=$((DupLimitKeeper[Width,Height]+1)); IfExist="${Destination}/${ImageType}${NumberOfBaseDir}/Resolution_${Width}x${Height}_DirN${SubDirNumber}" if [ ! -d "$IfExist" ];then echo mkdir -vp "$IfExist" NumDir=$((NumDir+1)); fi ## Creating a new numbered file type folders if [ "${DupLimitKeeper[Width,Height]}" -gt $SDN ]; then SubDirNumber=$((SubDirNumber+1)); DupLimitKeeper[$Width,$Height]="0"; fi ## Adding a file number FileNameOnly="${PathToFile##*/}" NewFileName="N${CountAll}C${FileNameOnly}" #NewFileName="${FileNameOnly}" ## Creating a new sub-dir when limit of files in a sub-folder is reached if [ $NumDir -gt $NBD ];then NumberOfBaseDir=$((NumberOfBaseDir+1)); NumDir="0"; fi ## if [ -f "${PathToFile}" ];then echo mv -v "${PathToFile}" "$IfExist/$NewFileName"; # echo cp -v "${PathToFile}" "$IfExist/$NewFileName"; fi CountAll=$((CountAll+1)) done echo Total processed files: $CountAll
See also
- sort photos into folders based on EXIF data[リンク切れ 2022-09-23]