【问题标题】:How to make ImageMagic identify accept input from a pipe?如何让 ImageMagic 识别接受来自管道的输入?
【发布时间】:2019-12-17 17:34:58
【问题描述】:

尝试将图像列表从 find 传送到 identify,但我没有得到任何输出。

使用此命令,我没有得到任何结果。

find . -iname "*.jpg" -type f | identify -format '%w:%h:%i' 

但是,如果我使用这个命令,它不使用管道而是使用 find-exec 选项工作正常。

find . -iname "*.jpg" -type f -exec identify -format '%w:%h:%i\n' '{}' \;

有谁知道为什么会发生这种情况以及如何正确使用管道而不是find -exec

【问题讨论】:

  • find -iname '*.jpg' -type f -exec identify -format '%w:%h:%i\n' {} +。这将在大批量文件上运行identify,而不是为每个文件运行 fork+exec。或使用find ... -print0 | xargs -0 identify ...

标签: linux imagemagick pipe zsh identify


【解决方案1】:

你的第一个命令,即:

find . -iname "*.jpg" -type f | identify -format '%w:%h:%i'

不起作用,因为 identify 期望文件名作为参数,而不是 stdin


如果你想让identify 从文件中读取文件名,你可以使用:

identify -format '%w:%h:%i\n' @filenames.txt

如果你想让identifystdin 读取文件名,(这是你的用例)使用:

find . -iname "*.jpg" -type f | identify -format '%w:%h:%i\n' @-

如果您想快速并行处理大量文件,请使用 GNU Parallel

find . -iname "*.jpg" -print0 | parallel -0 magick identify -format '%w:%h:%i\n' {}

【讨论】:

  • 马克,关于@-的好点。注意:某些系统可能需要编辑他们的 policy.xml ImageMagick 文件以允许使用它。
【解决方案2】:

这对我有用:

identify -format '%w:%h:%i\n' $(find . -iname "*.jpg")


注意:我添加了 \n 以便每张图片都将在新行上列出。

【讨论】:

  • 有趣的方法。
【解决方案3】:

想通了,我需要使用 xargs

find . -iname "*.jpg" -type f | xargs -I '{}' identify -format '%w:%h:%i\n' {}

方括号'{}'用于表示文件数组。

【讨论】:

    猜你喜欢
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2020-09-15
    • 2017-11-10
    相关资源
    最近更新 更多