3

我正在使用 ImageMagick 创建照片的缩略图。

我正在使用 Windows 操作系统。

我的源文件包含在许多子文件夹中。

我希望通过保存到不同驱动器上的目标文件夹来制作源文件的缩略图,同时保留相同的文件夹结构并修改原始文件名。

目标文件名与源文件名相同,但修改了 1 个字符:

来源示例:

c:\images\1\1L0000021.jpg
c:\images\1\1L000561.jpg
c:\images\2\234L0000032.jpg
c:\images\3\31214L000001.jpg

到目标驱动器:

d:\images\1\1M0000021.jpg
d:\images\1\1M000561.jpg
d:\images\2\234M0000032.jpg
d:\images\3\31214M000001.jpg

注意:L 到 M 只需要改变一个字母

源文件名模式始终是:*l*.jpg

这是我要运行以进行图像处理的命令:

convert -thumbnail 200x220^^ -gravity center -extent 200x200 -quality 80 c:\images\*.jpeg d:\images\output.jpeg

上述命令从源文件夹创建所需的缩略图并保存到目标文件夹,但输出文件名不正确,它不会遍历子文件夹。

问题:

1)如何遍历每个文件夹和子文件夹,然后输出到目标驱动器上完全相同的结构(如果文件夹不存在,则创建文件夹)

2)如何修改输出文件名,使其*l*.jpeg变为*m*.jpeg

4

3 回答 3

3

更新

这是我的最终代码,以防将来对任何人有所帮助:

::You must first install ImageMagick

::This job converts large photos into 200x200 thumbnails and saves the new files to the specified destination.

@echo off 
setlocal enabledelayedexpansion

SET "@SOURCE=C:\Test\photos\"
SET "@DEST=C:\dest"

REM Replicate source folder structure to destination:

for /r %@SOURCE% %%D in (.) do (

    echo Creating folder: %@DEST%%%~pnxD
    @md "%@DEST%%%~pnxD"

)


REM Select images from source using wildcard:

for /r %@SOURCE% %%F in (*l*.jpeg) do (

    REM Modify file name (i'm replacing 'l' for 'm')  

    set "fname=%%~nF"
    set "fname=!fname:l=m!"


    REM Convert source image to thumbnail and save to destination:

    REM echo Source: %%F
    echo Saving: %@DEST%%%~pnxF

    @convert -thumbnail 200x220^^^^ -gravity center -extent 200x200 -quality 80 "%%F" "%@DEST%%%~pF!fname!%%~xF"

)
于 2013-07-23T15:08:09.393 回答
2

1) 这是您将文件夹树从 C:\source 复制到 X:\dest 的方式:

for /r C:\source %I in (.) do @md "X:\dest%~pnxI"

这个 for 循环的作用是遍历文件夹树,从 C:\source 开始,每个文件夹名称都在变量 %I 中。命令“md”是“mkdir”的缩写。修饰符“~pnx”去掉了原来的驱动器号,这样就可以在前面加上 X:\dest。请注意,“X:\dest”之后没有反斜杠,因为保留了原始路径的第一个反斜杠。

2) 使用相同的命令运行 Imagick 命令来处理您的 JPEG 文件:

for /r C:\source %I in (.) do @convert -options %I "X:\dest%~pnxI"

目标名称相同。3) 使用 Naru 的 FlexibleRenamer 工具重命名目标树中的所有 JPEG ( http://hp.vector.co.jp/authors/VA014830/english/FlexRena/ )。它可以使用正则表达式来选择和修改名称。你会重命名

"(\d+)L(.+)"

"\1M\2"

含义:至少一位小数,后跟文字“L”,后跟至少一个字符。该名称由第一部分、文字“M”和第二部分替换。

编辑:处理步骤 2)需要一个文件选择器才能工作,如下所示:

for /r C:\source %I in (*.jpg) do @convert -options %I "X:\dest%~pnxI"

否则,仅处理文件夹名称 - 根据“转换”程序,这可能足够也可能不够。

于 2013-07-23T11:18:44.760 回答
2

尝试这个:

@echo off &setlocal enabledelayedexpansion
for /r "c:\images" %%a in (*.jpg) do (
    set "fname=%%~na"
    set "fname=!fname:L=M!"
    md "D:%%~pa" 2>nul
    convert -thumbnail 200x220^^ -gravity center -extent 200x200 -quality 80 "%%~fa" "D:%%~da!fname!%%~xa"
)
于 2013-07-23T11:52:28.123 回答