按分辨率排序图片
当文件恢复完成后,并且您借助 恢复后任务 脚本还原了图片,那么按分辨率对图片进行排序可能是明智的。 这将有助于将您拍摄的照片、网络摄像头图像或任何其他图像按分辨率分类到文件夹中,因为它们中的大多数通常使用相关的图像分辨率。
收集图片信息
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 返回的退出状态码。
- 如果图像包含足够的可读视觉数据以供显示,则 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]
jpeginfoAUR 工具不能递归扫描目录,但可以从 find -type f -name "*.jpg">>FileWithPathTo-images.txt 创建的文件中读取文件名,计算它们的 md5sum,并有一个选项使其能够删除损坏的图像文件。为了从脚本中的字符串中提取必要的数据,最好使用 表达式 而不是像 sed 或 gawk 这样的外部程序,以使脚本运行得更快,例如:
AA="$(jpeginfo -c f62152912.jpg)";
ZZ="${AA/*' [OK]'/}";
if [ 'XX'"$ZZ" == 'XX' ]; then
echo File is good'!!!';
fi
collect-info-about-images.sh 脚本按模式生成关于图片的数据
full path to image|Width|size|Height|size|Format|type of image|Errors|exit code by feh|
示例:Images/f269351998.bmp|W|40|H|39|Format|bmp|Errors|0|
按分辨率排序图片
此脚本根据分辨率创建文件夹。您可以设置每个文件夹中应包含多少文件以及基本文件类型命名文件夹中应包含多少子目录的限制。当达到限制时,将在目录名称中添加一个新的顺序编号以进行创建。如果您有大量文件,并且不想用所有文件重载单个文件夹,那么您还可以在基本目标变量 IfExist="${Destination}/ 之后为新的子文件夹添加您自己的计数器,只需注意引号 " 位于整个目标路径的开头和结尾即可。 浏览包含有限数量图像的文件夹会更容易,缩略图加载速度更快,并且记住或添加到收藏夹文件夹编号/名称,而不是试图在可能包含数千张图像的重载文件夹中再次找到相同的图像。
- 这些脚本仅为示例,您必须根据自己的需要进行修改后才能使用,请务必小心!
- 仅在您确认路径已正确创建并且从源文件中读取变量没有问题后,才删除
echo命令,特别是如果您在collect-info-about-images.sh文件中添加了自己的选项以收集、存储和使用有关图像的更多信息的情况下。
- 您必须删除
mkdir和mv前面的echo命令。 - 屏幕上的任何输出都会减慢脚本速度,为了使其更快,请通过删除
-v选项来禁用mv和cp的详细输出。 - 为了监控脚本是否正在运行,您可以使用 CPU 监视器实用程序并列出目标目录中的文件夹。或者仅在那些将最小化输出的脚本部分中添加
echo命令,例如,用于更新文件夹编号的计数器部分,以避免时间无止境的感觉。 - 您也可以用
cp命令替换mv命令,以复制文件而不是移动文件。
#!/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