通过 jpg 文件属性过滤的 Shell 脚本

Fré*_*ick 3 shell scripting jpeg images

我试图找到一种方法来过滤数千个 jpg 文件,并只保留具有特定属性的文件(例如拍摄图片的相机品牌)。我怎么能这样做?

Gil*_*il' 6

有多种工具可以提取EXIF数据,甚至可以根据 EXIF 数据操作图像文件。

使用exiftool,您可以根据 exif 属性重命名文件。特别是,您可以轻松地将文件分派到以特定 exif 属性命名的子目录中。然后,您可以查看结果并删除包含您闲暇时不感兴趣的文件的目录。

exiftool  '-Directory<${Model}/%d' -r .
Run Code Online (Sandbox Code Playgroud)

Exiftool 使这变得简单,但为了说明,这里有一个 shell 片段,它使用exif根据 EXIF 属性将 jpeg 文件分类到子目录中。属性值不得包含/字符。您可以-t通过运行找到该选项的编号exif -l

for f in *.jpg; do
  v=$(exif -m -t 0x0110 -- "$f" 2>/dev/null)
  if [ -n "$v" ]; then
    mkdir -p -- "$v"
    mv -- "$f" "$v"
  fi
done
Run Code Online (Sandbox Code Playgroud)

使用Exiv2,将v=…行替换为v=$(exiv2 -g Exif.Image.Model -Pv -- "$f")

如果您的文件已经组织在目录树中,请调用find以递归方式遍历目录树。假设您的所有图像都位于名为unknown. 下面的代码段为每个图像模型创建一个目录并复制文件,镜像原始目录层次结构。

find unknown -name '*.jpg' -exec sh -c '
    v=$(exif -m -t 0x0110 -- "$f" 2>/dev/null)
    [ -n "$v" ] || exit
    d=${0#*/}; d=${d%/*}
    mkdir -p -- "$v/$d"
    mv "$0" "$v/$d"
' {} \;
Run Code Online (Sandbox Code Playgroud)