我创建了一个ImageMagick命令来连接具有某些名称的图像:
convert -append *A_SLIDER.jpg *B_SLIDER.jpg out.jpg
我有很多名为* A_SLIDER.jpg和* B_SLIDER.jpg的文件夹,彼此相邻(目录中只有一对)。
我想以递归方式搜索包含许多文件夹的目录,并执行命令以加入图像。
如果可以根据输入图像来命名输出图像,例如
DOGS_A_SLIDER.jpg
和DOGS_B_SLIDER.jpg
合并为DOGS_SLIDER.jpg
答案 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”查找目录。