Bash
我需要在 bash 中創建一個循環以垂直連接圖像並輸出多個連接的頁面進行列印
**我正在執行 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
)。