基于编号名称处理文件块

时间:2017-09-02 12:19:43

标签: windows batch-file cmd imagemagick

在一个文件夹中,我有数百个名为的文件:

miserables-0001.png
miserables-0002.png
miserables-0003.png
...
miserables-0010.png
miserables-0011.png
...
miserables-0100.png
miserables-0101.png
...
miserables-0999.png
miserables-1000.png
...

我想要的是使用imagemagick -append命令将每20个文件垂直追加到一个png中。 那么,前20个文件

miserables-0001.png miserables-0002.png ... miserables-0020.png

将附加在

miserables-appended-0001.png

和第二个20个文件

miserables-0021.png miserables-0022.png ... miserables-0040.png

将附加在

miserables-appended-0002.png

等等。

3 个答案:

答案 0 :(得分:0)

有两种方法可以实现这一目标:

从文件中读取

将文件名放在文本文件中。假设您的file.txt具有输入名称,例如:

  

悲惨-0001.png

     

悲惨-0002.png

     

悲惨-0003.png

     

...

     

悲惨-0020.png

然后您可以通过以下方式申请convert

convert @file.txt result.gif

输入范围

您可以根据编号为convert提供一系列输入。对于您的输入,您可以:

convert miserables-000%d.png[1-9] result.gif

阅读ImageMagick documentation了解更多详情。

答案 1 :(得分:0)

%d方法不起作用,因为它忽略了前导零,你必须补偿每个范围1-9 10-99 100-999 1000-9999,这使得很难抓住大块的20。

所以这是带有两个堆叠计数for /l循环的文件方法 要获得前导零,最简单的是将数字加1,并使用带有子串的最后4位数。

要检查结果,批次将使用方案
创建文件 miserables-#xxxx-yyyy.ext

@Echo off 
Setlocal EnableDelayedExpansion

Set "Prefix=miserables"
:: Get Max png count
:: (prepend with 1 to avoid set /A interpreting leading 0 as octal)
for /f "tokens=2 delims=-." %%A in ('Dir /B %Prefix%-*.png') Do @set "Max=1%%A"
Echo Max = %Max:~1%

:: loop from 0001 step 20 to %Max%
For /l %%A in (10001,20,%Max%) Do (
    Set From=%%A
    Set /A To=%%A+19
    If !To! gtr %Max% Set To=%Max%
    Set "File=%Prefix%-#!From:~-4!-!To:~-4!"
    Echo Processing !File!
    Del "!File!.txt" >NUL 2>&1
    For /l %%B in (!From!,1,!To!) Do (
        Set _B_=%%B
        >> "!File!.txt" Echo %Prefix%-!_B_:~-4!.png
    )
    Call Magick @!File!.txt -append !File!.png
)

我使用生成的数字图片进行测试:

enter image description here

谁对如何感兴趣:

:: Q:\Test\2017\09\02\GenPNGs.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
For /l %%A in (10001,1,10205) Do (
    Set "#=%%A"&Set "#=!#:~1!"
    magick convert ^
        -size 200x85 canvas:none -background white^
        -font Courier-New -pointsize 72 ^
        -draw "text 15,60 '!#!'" -channel RGBA -gaussian 0x6 ^
        -fill black -stroke blue ^
        -draw "text 10,55 '!#!'" ^
        miserables-!#!.png
)

答案 2 :(得分:0)

如果您对感到满意,我建议您使用或其他标准实用程序。

我可以想到两种方法,但我确信其他人可以提出简化的单行。

嵌套循环

#!/bin/bash

PREFIX="miserables-"
SUFFIX=".png"

# Get count of files
TOTAL=$(ls -l ${PREFIX}*${SUFFIX} | wc -l | bc)

# Create output cursor to increment with each 20th iteration.
CURSOR=0

# Iterate start of each 20
for START in $(seq 1 20 $TOTAL)
do
    END=$(($START + 19))
    FILES=""
    # Collect each filename
    for ITER in $(seq -f "%04g" $START $END)
    do
        # Build filename
        FILE="${PREFIX}${ITER}${SUFFIX}"
        # Double check that the file exists.
        if [ -f $FILE ]; then
            FILES="${FILES} ${FILE}"
        fi
    done
    # Increment the output cursor
    CURSOR=$(($CURSOR + 1))
    # Write output file
    convert $FILES -append output/miserables-appended-${CURSOR}.png
done

仅对20 th 项目

采取行动
#!/bin/bash

PREFIX="miserables-"
SUFFIX=".png"
CURSOR=0;
OUTPUT_CURSOR=0;
FILES=""

# Find all files
for FILE in $(ls ${PREFIX}*${SUFFIX})
do
    # Increment cursor
    CURSOR=$(($CURSOR + 1))
    # Append file to list
    FILES="${FILES} $FILE"
    # If we're on the twentieth file, create output
    if [[ $(($CURSOR % 20)) -eq 0 ]]; then
        # Incement output cursor
        OUTPUT_CURSOR=$(($OUTPUT_CURSOR + 1))
        # Write output file
        convert $FILES -append output/miserables-appended-${OUTPUT_CURSOR}.png
        # Reset file list
        FILES=""
    fi
done