#linux #bash #imagemagick #imagemagick-convert
Вопрос:
Я пытаюсь написать код, чтобы сделать следующее.
1: Соберите все имена каталогов из входной строки в строку (количество входных данных каталога может варьироваться)
2: Для всех файлов tiff в этих каталогах отредактируйте изображения (с помощью imagemagick) с одинаковыми именами и сохраните их в основной папке или в указанной папке.
Я хочу объединить два или более изображений (в зависимости от количества каталогов во вводе командной строки). В каждом каталоге есть выходные изображения с тем же именем, что и в другом каталоге. Я хочу объединить файлы с одинаковыми именами из заданных каталогов
Код, который я написал, приведен ниже, но он не передает $name в качестве переменной команде редактирования. Что я здесь делаю не так? Любая помощь будет очень признательна.
for arg in "$@"; do # n1=$arg fname =$n1"${name} " #Get all the directory names in a string with $name at the end. for eg: Baseline/$name done echo $fname for n in $arg/*.tif; do name="$(basename "$n")" name1=$(echo "$name" | cut -f 1 -d '.') montage -tile 3x3 $fname name1.png exit done
Комментарии:
1. На самом деле не очень понятно, что вы пытаетесь сделать! Может быть, вы можете показать некоторые имена файлов в некоторых каталогах и сказать, какие из них вы хотите отредактировать?
2. @MarkSetchell Я добавил изображение. Надеюсь, это поможет. Спасибо!
3. Хорошо, я вижу, что вы на самом деле пытаетесь сделать сейчас! Мой ответ неверен для этого, поэтому я пока удалю его и поработаю над его исправлением, а затем восстановлю его, если/когда я получу решение.
Ответ №1:
Обновленный Ответ
Спасибо за разъяснение, вы можете делать все, что хотите, если сохраните следующее как monty.sh
и сделайте его исполняемым с помощью:
chmod x monty.sh
Вот код:
#!/bin/bash # Goto first subdirectory and take it off args list cd "$1" shift # Grab remaining directory names into array friends=( "$@" ) gt;$2 echo "DEBUG: friends=${friends[@]}" # Iterate over files in first directory for this in *.tiff ; do gt;amp;2 echo "DEBUG: this=$this" # Generate list of files to montage { # ... starting with this one... echo "$this" # ... and adding in his friends for friend in "${friends[@]}" ; do next="../${friend}/${this}" gt;amp;2 echo "DEBUG: next=$next" if [ -f "$next" ] ; then echo "$next" else gt;amp;2 echo "ERROR: file $next is missing" fi done } | magick montage -tile 3x @- ../"${this/tiff/png}" done
Тогда ваша команда будет:
./monty.sh Output1 Output2 Output3
или, более кратко:
./monty.sh Output{1,2,3}
В случае, если вы не знакомы с bash
синтаксисом, код в середине for
цикла, по сути, выполняет:
... ... { echo first filename to montage onto stdout echo second filename to montage onto stdout echo third filename to montage onto stdout } | magick montage lt;ALL FILENAMES ON STDINgt; result.png
Поэтому важно, чтобы все сообщения об ошибках внутри {...}
отправлялись в stderr
другое место, сообщения об ошибках будут отправляться montage
команде, которая будет интерпретировать их как имена файлов. Вот почему все инструкции отладки начинаются с gt;amp;2 echo ...
, потому что это указывает им stderr
, чтобы они не путались stdout
.
Оригинальный Ответ
Я не понимаю, что вы пытаетесь сделать , но если вы можете записать все имена файлов в ImageMagick stdin
, вы можете сделать их монтажными вот так:
find . -name "*.tif" -print | magick montage -geometry 0 0 -tile x3 @- result.png
Комментарии:
1. Спасибо @MarkSetchell. Этот код будет объединять/монтировать все изображения в одной папке, если я правильно понял. Я хочу объединить два или более изображений (в зависимости от количества каталогов во вводе командной строки). В каждом каталоге есть выходные изображения с тем же именем, что и в другом каталоге. Я хочу объединить файлы с одинаковыми именами из заданных каталогов
2. Я думаю, что сейчас он делает то, что вы хотите — пожалуйста, взгляните еще раз.
3. Спасибо! Это отлично работает! в некоторых именах файлов есть пробел. Я попытался поместить $this в двойные кавычки, но это не сработало. Я думаю, что пространства — это проблема для монтажа? Также добавлен «-режим объединения» для повышения качества. режим магического монтажа объединяет плитку 3x @- ../»${this/tif/png}»
4. Здесь уже поздно. Я разберусь с этим завтра, если ты не найдешь его раньше меня…
5. В качестве очень быстрого решения вы можете заменить
echo "$this"
magick "$this" miff:-
иecho "$next"
сmagick "$next" miff:-
, а затем в конце использованияmagick montage -tile x3 miff:- ...