根据内容是图片还是图形对图像文件进行排序:更新旧的解决方案?

根据内容是图片还是图形对图像文件进行排序:更新旧的解决方案?

有人想要根据文件是否存在对目录中的文件进行排序图片(相机)与设计图形。在堆栈溢出, 有一个较旧的解决方案/概念验证涉及图像中颜色范围的比较。我几乎按原样复制它:1

检查卡通.sh:

#!/bin/sh

IMAGE=$1
COLORS=$(convert $IMAGE -format %c histogram:info:- | wc -l)
WIDTH=$(identify $IMAGE | sed -r "s/.* ([0-9]+)x[0-9]+ .*/\1/")
HEIGHT=$(identify $IMAGE | sed -r 's/.* [0-9]+x([0-9]+) .*/\1/')
RATIO=$(echo $WIDTH $HEIGHT $COLORS | awk '{ print ($1 * $2)/$3;}')
echo $RATIO | awk '{ printf "%020.5f",$1 }' 

选择所有.sh:

#!/bin/sh

FILES=$(ls)
for FILE in $FILES; do
IsIMAGE=$(identify $FILE 2>&1 | grep " no decode delegate " | grep -o "no")
if [ "$IsIMAGE" = "no" ]; then continue; fi
IsIMAGE=$(identify $FILE 2>&1 | grep " Improper image header " | grep -o "Improper")
if [ "$IsIMAGE" = "Improper" ]; then continue; fi
echo $(CheckCartoon.sh $FILE) $FILE
done

典型输出:

00000000000002.16959 Burne_Jones_The_Doom_Fulfilled_1884_85.jpg
00000000047480.70000 Dürer-Hieronymus-im-Gehäus.jpg
00000000000016.03440 IMG_00000138.jpg
00000000000015.67780 IMG_00000143.jpg
00000000000014.37140 IMG_00000144.jpg
00000000000015.05500 IMG_00000145.jpg
00000000000011.79040 M2-GrandTurk1.jpg
00000000000013.05840 Real-01.jpg

我认为这个解决方案很有趣,尽管它有缺点,我想探索它并且:

  • 使用最佳实践来更新它并使其更安全、更强大,因为我认为添加脚本只是为了展示这个想法
  • 让它创建两个目录来根据a复制文件 临界点这将在脚本中设置或作为运行时的参数。一般来说,非常低的值应该意味着类似于相机图片(或者至少不是颜色范围有限的图形)。因此,如果我将阈值设置为 50,则除了一张图像之外的所有图像都会被复制到 图片目录,而丢勒一个人会去图形

我想要一些关于尝试这样做的建议。


1. SO 的答案因编辑者在反引号上做错了而受到影响。另外,还有粗体吗?其中一个块内的标记。当然每个人都想弄清楚,但初学者可能不会。

答案1

如果您使用,mkdir -p则不会对已存在的目录有任何抱怨,因此请将以下内容放在顶部CheckAll.sh

 mkdir -p graphics pictures

该行echo $(CheckCartoon.sh $FILE) $FILE仅显示计算结果和文件名,您应该用它做更多的事情,所以将其替换为:

# store value
result=$(CheckCartoon.sh $FILE)
# do a string compare
if [[ $result < "00000000000050." ]]
then
    echo move "$FILE" to graphics $result
    mv "$FILE" graphics
else
    echo move "$FILE" to pictures $result
    mv "$FILE" pictures
fi

至于鲁棒性,您可能不应该首先使用 shell 脚本。但您至少可以进行额外的检查$result以确保脚本返回有效值。

相关内容