Bash

我需要在 bash 中創建一個循環以垂直連接圖像並輸出多個連接的頁面進行列印

  • April 30, 2022

**我正在執行 Ubuntu 18.04。**我有一個目錄,裡面全是故事板圖像,.jpg格式如下。

image-0000.jpg
image-0001.jpg
image-0002.jpg
image-0003.jpg
image-0004.jpg
.
.
image-3898.jpg
image-3899.jpg

**垂直合併 13 張圖像給我一個單頁。**所以我想我需要使用下面的命令,在循環中一次使用 13 個數字的範圍並保存到目錄"./Merged"中。

convert -append image-{range of 13}.jpg ./Merged/page_001.jpg

我的實驗和思考過程如下。

我正在嘗試使用嵌套for循環,seq -w如下所示。但我無法理解,如何以這樣的方式循環腳本,它需要前 13 個文件(from image-0000 to image-0012),合併它們並保存在./Merged/文件夾中。然後退出循環並再次獲取接下來的 13 個文件(from image-0013 to image-0025),依此類推。直到.jpg目前文件夾中的所有文件都完成或直到生成 300 頁。

我的腳本

#!/bin/bash

# As 3899 image slices will be converted to 300 pages
# I thought to run for loop 300 times

for ((page=1; page<=300; page++))
do
  # As images are slices of pages.
  for slices in $(seq -w 0 3899)
  do

   # We need to merge 13 times so...
   # Should i use for loop with increment as below?
   # for ((smerge=1; smerge<=13; smerge++))
   # do
   #   convert "SOME LOGIC" ./Merged/page_001.jpg
   # done

   # **OR**
   # somehow take 13 numbers from sequence

       convert image-$slices_{RANGE}.jpg -append ./Merged/page_$page.jpg 
       
  done

done

zsh

#! /bin/zsh -

typeset -Z3 page
files=(image-<0-3900>.jpg)
for ((page = 1; $#files; page++)) {
 convert $files[1,13] -append ./Merged/page_$page.jpg
 files[1,13]=()
}

請注意,由於有 3901 張圖像(13 × 300 + 1),最後一頁將只有一張圖像。

你可以做類似的事情bash

#! /bin/bash -
shopt -s extglob
shopt -s failglob
set -- image-+([[:digit:]]).jpg
for ((page = 1; $#; page++)) {
 printf -v padded_page %03d "$page"
 convert "${@:1:13}" -append "./Merged/page_$padded_page.jpg"
 (($# > 13)) || break
 shift 13
}

POSIXly,假設有匹配的文件並對文件名做一個不太密切的檢查:

#! /bin/sh -
set -- image-*.jpg

# disable split+glob, only retain empty removal on unquoted expansions:
set -o noglob; IFS=

page=1; while [ "$#" -gt 0 ]; do
 padded_page=000$page
 padded_page=${padded_page#"${padded_page%???}"}
 convert $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} \
   -append "./Merged/page_$padded_page.jpg"
 [ "$#" -gt 13 ] || break
 shift 13
 page=$((page + 1))
done

請注意,雖然這裡的文件名非常馴服(沒有空格,特殊字元……),但在這些程式碼中已經特別注意處理任意字元。但是請注意,convert其他 imagemagick 實用程序可能會在文件名以-(即使使用--)或包含開頭時出現問題:,因此最好在文件路徑前加上前綴./以避免這些問題(例如,使用./*.jpg代替*.jpg)。

引用自:https://unix.stackexchange.com/questions/449406