【问题标题】:How do I recursively find files with specific names and join using ImageMagick in Terminal?如何递归查找具有特定名称的文件并在终端中使用 ImageMagick 加入?
【发布时间】:2014-12-18 15:48:49
【问题描述】:

我创建了一个 ImageMagick 命令来连接具有特定名称的图像:

convert -append *A_SLIDER.jpg *B_SLIDER.jpg out.jpg

我有很多文件夹,其中包含名为 *A_SLIDER.jpg 和 *B_SLIDER.jpg 的文件彼此相邻(目录中只有一对)。

我想递归搜索一个有很多文件夹的目录并执行命令来加入图像。

如果可以根据输入图像命名输出图像,那就太好了,例如

  • => DOGS_A_SLIDER.jpgDOGS_B_SLIDER.jpg 将合并为 DOGS_SLIDER.jpg

【问题讨论】:

    标签: macos bash shell terminal imagemagick


    【解决方案1】:

    类似这样,但先备份并仅在示例目录上尝试!

    #!/bin/bash
    find . -name "*A_SLIDER*" -execdir bash -c ' \
        out=$(ls *A_SLIDER*);
        out=${out/_A/}; \
        convert -append "*A_SLIDER*" "*B_SLIDER*" $out' \;
    

    找到所有包含字母“A_SLIDER”的文件,然后转到包含目录并从那里开始bash。当您在那里时,获取文件的名称,然后删除 _A 部分以形成输出文件名。然后用_A_和对应的_B_文件执行ImageMagickconvert,形成输出文件。

    或者,来自@gniourf_gniourf 的更简洁的建议...谢谢。

    #!/bin/bash
    find . -name "*A_SLIDER.jpg" -type f -execdir bash -c 'convert -append "$1" "${1/_A_/_B_}" "${1/_A/}"' _ {} \;
    

    【讨论】:

    • 这是完美的,谢谢!也感谢您的解释
    • 我真的不明白你在声明out=$(ls *A_SLIDER*)中的逻辑是什么。这在我看来是危险和错误的(解析ls 总是——或几乎总是——一个非常糟糕的主意)。
    • @gniourf_gniourf 如果您有一些改进建议,我愿意接受 :-)
    • 怎么样:find . -name "*A_SLIDER.jpg" -type f -execdir bash -c 'convert -append "$1" "${1/_A_/_B_}" "${1/_A/}"' _ {} \;
    • @gniourf_gniourf 是的,谢谢。那更简洁,我已将其编辑到我的答案中。我会留下我原来的答案,因为我个人认为这些步骤更小,更容易理解/维护/编辑。非常感谢。
    【解决方案2】:

    “查找”命令将递归搜索文件夹:

    $ find . -name "*.jpg" -print
    

    这将显示所有文件名。您可能需要“-iname”来进行不区分大小写的文件名匹配。

    您可以使用“-exec”添加命令行,其中“{}”替换为文件名。您必须使用“\;”终止命令行:

    $ find . -name "*.jpg" -exec ls -l {} \;
    

    您可以使用 sed 编辑文件名:

    $ echo DOGS_A_SLIDER.jpg | sed 's=_.*$=='
    DOGS
    

    您能指望您所有的“B”文件都与相应的“A”文件命名相同吗?也就是说,您不会在同一目录中拥有“DOGS_A_SLIDER.jpg”和“CATS_A_SLIDER.jpg”。如果是这样,以下内容并非您所需要的一切,但会有助于您的解决方案:

    $ find . -type f -name "*.jpg" -exec "(echo {} | sed 's=_.*==')" \;
    

    如果您的目录名称中包含下划线,那么该特定的 sed 脚本将执行错误的操作。

    "find . -type f" 查找常规文件;它的运行速度比没有 -type 稍快。使用“-d”查找目录。

    【讨论】:

    • 您好,感谢您的回复,我也不太清楚如何将 imagemagick 命令放入其中。我找到了一个可以解决问题的答案!
    • -exec "(echo {} | sed 's=_.*==')" \; 部分完全错误。系统将尝试执行名为 (echo DOGS_A_SLIDER.jpg | sed 's=_.*==') 的文件,该文件很可能不存在。
    猜你喜欢
    • 2017-03-15
    • 2019-05-28
    • 2017-08-08
    • 1970-01-01
    • 2011-08-21
    • 2011-04-08
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多