ImageMagick-合并部分文件名匹配的文件

时间:2019-01-29 19:47:40

标签: bash powershell batch-file imagemagick pdftk

这些是我在文件夹中的文件名

1710190363_1.jpg
1710190363_2.jpg
1711140603_1.jpg
1711140603_2.jpg
1711140603_3.jpg
1711140603_4.jpg
1711140603_5.jpg

所有都是.jpg文件。文件名是动态的但唯一的计数,前10位数字后跟下划线,后跟一位数字。

我使用imagemagick,尝试根据前十位数字将所有图像文件转换为pdf。我想要的输出如下

1710190363.pdf
1711140603.pdf

手动运行-

convert 1710190363_1.JPG 1710190363_2.JPG 1710190363.pdf

但不知道如何循环运行

for %a in (*.jpg) do convert %a o_%a.pdf

有人可以帮我这个脚本吗?

4 个答案:

答案 0 :(得分:3)

使用bash

考虑:

for f in *_1.jpg; do convert "${f%_1.jpg}"*.jpg "${f%_1.jpg}.pdf"; done

或者,对于那些喜欢使用命令的人来说,它们分散在多行上:

for f in *_1.jpg
do
    convert "${f%_1.jpg}"*.jpg "${f%_1.jpg}.pdf"
done

以上假设jpeg文件名以.jpg结尾。如果您的jpeg文件名实际上以.JPG结尾,请使用:

for f in *_1.JPG; do convert "${f%_1.JPG}"*.JPG "${f%_1.JPG}.pdf"; done

示例

如果我们有一个包含这些文件的目录:

$ ls
1710190363_1.jpg  1710190363_2.jpg  1711140603_1.jpg  1711140603_2.jpg  1711140603_3.jpg  1711140603_4.jpg  1711140603_5.jpg

我们的命令是:

for f in *_1.jpg; do convert "${f%_1.jpg}"*.jpg "${f%_1.jpg}.pdf"; done

我们的命令将导致convert执行两次,如下所示:

convert 1710190363_1.jpg 1710190363_2.jpg 1710190363.pdf
convert 1711140603_1.jpg 1711140603_2.jpg 1711140603_3.jpg 1711140603_4.jpg 1711140603_5.jpg 1711140603.pdf

工作原理

  • for f in *_1.jpg; do

    这将启动变量f的循环,其中f是目录中每个以_1.jpg结尾的文件的名称。

  • convert "${f%_1.jpg}"*.jpg "${f%_1.jpg}.pdf"

    这对每组文件运行convert

    ${f%_1.jpg}是删除了结尾_1.jpg的文件的名称。因此,全局"${f%_1.jpg}"*.jpg会扩展到以相同的开头前缀并以.jpg结尾的所有名称的列表。同样,"${f%_1.jpg}.pdf"是输出文件的名称。

  • done

    这表明循环结束。

答案 1 :(得分:0)

因此,您想按前10位数字对文件进行分组。下划线分割为第一个元素。

PowerShell

Get-ChildItem *.jpg | 
    Group-Object {$_.Name.Split('_')[0]} |
       ForEach-Object{
           &magick convert $($_.Group -join ' ') $_.Name+".pdf"
       }

答案 2 :(得分:0)

批处理解决方案

在此答复中,我将提供纯批处理解决方案。基于您要基于相同名称中的前10个数字转换文件的事实,我们可以提取所有文件名,仅获取前10个数字,然后将匹配的名称添加到单个字符串中。 / p>

这个过程有点复杂,但是我在脚本中为每个过程放置了多个Rem语句(注释)来解释它的作用。

ConvertFilesBasedOnFileMatched.bat:

@echo off
@setlocal EnableDelayedExpansion
set Count=1
set GetFName=1

Rem | Configuration
Set "MainDir=C:\New folder"
Set "Extension=.jpg"

Rem | Check If .XXX Files Exist
if not exist "!MainDir!\*!Extension!" (goto :EOF)

Rem | Grab All File Names
for %%A in ("!MainDir!\*!Extension!") do (

    Rem | Set as String, Grab First 10 Chars
    Set "CurrentName=%%~nA"
    Set "CurrentName=!CurrentName:~0,10!"

    Rem | Get First Name 
    If "!GetFName!"=="1" (

        Set "GetFName=2"

        Rem | Set as String, Grab First 10 Chars
        Set "FirstName=%%~nA"
        Set "FirstName=!FirstName:~0,10!"

    )

    Rem | Check For Differences
    If "!CurrentName!"=="!FirstName!" (

        set "CurrentList=!CurrentList! !CurrentName!_!Count!%%~xA"
        set /a "Count=!Count!+1"

    ) ELSE (

        Rem | Results Complete
        Convert !CurrentList:~1! !CurrentName!.pdf

        Rem | Reset For Future Loops
        set "Count=1"
        set "GetFName=1"
        set "CurrentList="

        Rem | Set Any Pending Data
        set "CurrentList=!CurrentList! !CurrentName!_!Count!%%~xA"
        set /a "Count=!Count!+1"

    )

)

Rem | Results Complete
Convert !CurrentList:~1! !CurrentName!.pdf

goto :EOF

此外,如果您需要解决每个图像的路径,请进行以下调整。

更改以下两个迭代:

set "CurrentList=!CurrentList! !CurrentName!_!Count!%%~xA" 

收件人

set "CurrentList=!CurrentList! !MainDir!\!CurrentName!_!Count!%%~xA"

有关命令的更多帮助,请在命令提示符下键入以下内容:

  • set /?
  • for /?
  • if /?
  • goto /?
  • 执行

答案 3 :(得分:0)

这是一个非常简单的解决方案,它假定:

  • _后面的数字总是从1开始计数;
  • 前缀相同的文件的处理顺序无关紧要;

这是批处理脚本中要使用的代码:

for /F "delims=_" %%F in ('dir /B /A:-D "*_1.jpg"') do convert "%%F_*.jpg" "%%F.pdf"

这是直接在命令提示符(cmd)中使用的代码:

for /F "delims=_" %F in ('dir /B /A:-D "*_1.jpg"') do @convert "%F_*.jpg" "%F.pdf"