这些是我在文件夹中的文件名
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
有人可以帮我这个脚本吗?
答案 0 :(得分:3)
考虑:
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)
这是一个非常简单的batch-file解决方案,它假定:
_
后面的数字总是从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"