Мне нужно создать цикл в bash для вертикального соединения изображений и вывода нескольких объединенных страниц для печати

linux-generic-lts-utopic зависит от 3.16.0-30. Если удалить 3.16.0-30, apt-get установит 3.16.0-50 в качестве зависимости, чтобы заменить 3.16.0-30. Таким образом, удаление linux-generic-lts-utopic первым удалит все зависимости и позволит очистить все 3.16.

1
27.10.2018, 18:28
3 ответа

С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).

1
27.01.2020, 23:32

Допустим, у вас есть эти файлы в непрерывном диапазоне от image-0000.jpgдо image-2999.jpg. Это должно продемонстрировать принцип работы здесь:

#!/bin/bash
for page in {000..001}; do
  echo image-${page}{0..9}.jpg
done

Итак, бросьте это в свой -кейс:

#!/bin/bash
for page in {000..001}; do
  convert image-${page}{0..9}.jpg --append./Merged/page-${page}.jpg
done

Обратите внимание, что {01..02}расширение до0102вместо12требует bash4.

1
27.01.2020, 23:32

Вы можете сделать это, используя аргументxargs-nи передать результат в цикл whileread.

page=1
while IFS= read -r row; do
    convert $row -append./Merged/page_$page.jpg
    page=$((page + 1))
done < <(echo image-{0000..3900}.jpg | xargs -n13)
0
27.01.2020, 23:32

Теги

Похожие вопросы