如何递归查找具有特定名称的文件并使用终端中的ImageMagick加入?

时间:2014-12-18 15:48:49

标签: macos bash shell terminal imagemagick

我创建了一个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

2 个答案:

答案 0 :(得分:3)

这样的东西,但先备份然后再尝试一个示例目录!

#!/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部分以形成输出文件名。然后使用convert和相应的_A_文件执行ImageMagick _B_以形成输出文件。

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

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

答案 1 :(得分:0)

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

$ 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”查找目录。