Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 如何在终端中使用ImageMagick递归查找具有特定名称的文件并进行连接?_Macos_Bash_Shell_Terminal_Imagemagick - Fatal编程技术网

Macos 如何在终端中使用ImageMagick递归查找具有特定名称的文件并进行连接?

Macos 如何在终端中使用ImageMagick递归查找具有特定名称的文件并进行连接?,macos,bash,shell,terminal,imagemagick,Macos,Bash,Shell,Terminal,Imagemagick,我创建了一个ImageMagick命令,用于连接具有特定名称的图像: convert -append *A_SLIDER.jpg *B_SLIDER.jpg out.jpg 我有很多文件夹,其中文件名为*A_SLIDER.jpg和*B_SLIDER.jpg,彼此相邻(一个目录中只有一对) 我想递归地搜索一个包含许多文件夹的目录,并执行命令来加入图像 如果可以根据输入图像命名输出图像,那将非常好,例如 =>DOGS\u A\u SLIDER.jpg和DOGS\u B\u SLIDER.jpg将

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

convert -append *A_SLIDER.jpg *B_SLIDER.jpg out.jpg
我有很多文件夹,其中文件名为*A_SLIDER.jpg和*B_SLIDER.jpg,彼此相邻(一个目录中只有一对)

我想递归地搜索一个包含许多文件夹的目录,并执行命令来加入图像

如果可以根据输入图像命名输出图像,那将非常好,例如

  • =>
    DOGS\u A\u SLIDER.jpg
    DOGS\u B\u SLIDER.jpg
    将组合到
    DOGS\u SLIDER.jpg
“查找”命令将递归搜索文件夹:

$ find . -name "*.jpg" -print
将显示所有文件名。您可能需要“-iname”,它进行不区分大小写的文件名匹配

您可以添加一个带“-exec”的命令行,其中“{}”被文件名替换。必须以“\;”结束命令行:

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

$ echo DOGS_A_SLIDER.jpg | sed 's=_.*$=='
DOGS
你能指望你所有的“B”文件都和对应的“A”文件同名吗?也就是说,在同一个目录中不会有“DOGS\u A\u SLIDER.jpg”和“CATS\u A\u SLIDER.jpg”。如果是这样的话,以下内容并不是您所需要的全部,但将有助于您的解决方案:

$ find . -type f -name "*.jpg" -exec "(echo {} | sed 's=_.*==')" \;
如果您有任何带有下划线的目录名,那么特定的sed脚本将执行错误的操作


“查找。-f类”查找常规文件;它的运行速度略快于没有-型。使用“-d”查找目录。

类似于此,但请先备份并仅在示例目录上尝试

#!/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
。在那里时,获取文件名,并删除
\u A
部分以形成输出文件名。然后使用
\u A
和相应的
\u B
文件执行ImageMagick
转换
,以形成输出文件

或者,@gniourf\u gniourf提供更简洁的建议。。。多谢各位

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

这太完美了,谢谢!也谢谢你的解释,我真的不明白你的逻辑在语句中是什么
out=$(ls*A\u SLIDER*)
。这对我来说是危险和错误的(解析
ls
总是或几乎总是-一个非常糟糕的主意)。@gniourf\u gniourf如果您有一些建议,我愿意接受改进建议:-)如何:
查找-名称“*A_SLIDER.jpg”-type f-execdir bash-c'convert-append“$1”“${1/_A_/_B_}”“${1/_A/}”'.{}?@gniourf\u gniourf是的,谢谢。这更为简洁,我已将其编辑成我的答案。我个人认为这些步骤更小,更容易理解/维护/编辑,因此我将保留我的原始asnwer。非常感谢。您好,感谢您的回复,我也不太确定如何将imagemagick命令也包含在其中。我找到了一个解决办法,干杯!部分
-exec“(echo{}sed's=..*=')”\是完全错误的。系统将尝试执行名为
的文件(echo DOGS_a_SLIDER.jpg | sed's=.*=')
,该文件很可能不存在。
#!/bin/bash
find . -name "*A_SLIDER.jpg" -type f -execdir bash -c 'convert -append "$1" "${1/_A_/_B_}" "${1/_A/}"' _ {} \;