【问题标题】:Find and sort images by EXIF data (camera model) almost working通过 EXIF 数据(相机型号)查找和排序图像几乎可以正常工作
【发布时间】:2021-04-15 16:16:48
【问题描述】:

正如标题所说,我正在尝试根据用于拍摄它们的相机对文件夹中的图像进行排序。我一直在努力学习如何使用管道和 xargs,我想我快到了。唯一的问题是最后一个 xargs 似乎只在 awk 遍历整个文件夹而不是每个文件时才执行。如果我这样做:

find temp/sorted/jpg_over_300px/ -type f -exec identify -quiet -format '%[EXIF:model] %i \n' '{}' \; | gawk '$2=="SE" {print $3}'

我得到了很好的干净结果,找到了新的文件,并且 exif 相机型号与 iPhone SE 的“SE”匹配。但是,如果我添加 xargs -I % mv % [new_folder] 命令将文件移动到不同的文件夹,则 mv 只有在所有文件夹都被完全扫描后才会执行(我知道,因为我尝试过使用仅包含一个文件的文件夹)。

find temp/sorted/jpg_over_300px/ -type f -exec identify -quiet -format '%[EXIF:model] %i \n' '{}' \; | gawk '$2=="SE"{print $3}' | xargs -I % mv % temp/sorted/jpg_iphone_se/

我想避免这种情况,因为我的文件夹中有很多文件,我想避免“参数过多”的情况。我尝试将 -print0 添加到 find 并将 -0 添加到 xargs 但没有运气。

感谢您的宝贵时间

【问题讨论】:

    标签: pipe exec xargs


    【解决方案1】:

    已排序,感谢 [this question][https://unix.stackexchange.com/questions/336184/use-output-from-awk-as-input-for-mv]

    我还进行了一些清理和 stderr 重定向,以仅向 awk 发送有效请求。

    find temp/sorted/jpg_over_300px/ -type f -exec identify -format '%[EXIF:model] %i\n' '{}' \; 2> /dev/null | awk '/iPhone 5S/ {system("cp "$3" temp/sorted/jpg_iphone_5s")}'
    

    对于像我一样正在学习的人,这里是一步一步的:

    find temp/sorted/jpg_over_300px/ -type f -exec identify -format '%[EXIF:model] %i\n' '{}' \;
    

    使用命令find,查看文件夹temp/sorted/jpg_over_300px/中的文件-type f,每次找到时执行命令识别-exec identify提取有关相机型号-format '%[EXIF:model]'的exif数据和文件 '%i' 的名称加上换行符 \n 以将格式正确的结果发送到管道的其余部分。在进入管道的其余部分之前,我们通过将 stderr 重定向到黑洞2>/dev/null 来消除错误消息,然后我们通过管道进入 awk | awk,它将在通过管道传输的数据中查找 iPhone SE '/iPhone 5S/ 和执行系统命令cp将文件复制到新文件夹{system("cp "$3" temp/sorted/jpg_iphone_5s")}'

    【讨论】:

      猜你喜欢
      • 2022-06-28
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2013-03-31
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2017-06-06
      相关资源
      最近更新 更多