Как выполнить imagemagick со строкой в качестве входных данных для имен файлов — в bash

#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:- ...