Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

195
Visualizações
Cómo ejecutar imagemagick con una cadena como entrada para nombres de archivo - en bash

Estoy tratando de escribir un código para hacer lo siguiente.

1: obtenga todos los nombres de directorio de la línea de entrada en una cadena (la cantidad de entradas de directorio puede variar)

2: Para todos los archivos tiff en esos directorios, monte las imágenes (usando imagemagick) con los mismos nombres y guárdelas en la carpeta principal o en la carpeta dada.

Quiero combinar dos o más imágenes (según la cantidad de directorios en la entrada de la línea de comando). Cada directorio tiene salidas de imagen con el mismo nombre en el otro directorio. Quiero combinar archivos con los mismos nombres de directorios dados

El código que escribí está debajo, pero no está pasando $name como variable al comando de montaje. ¿Qué estoy haciendo mal aquí? Cualquier ayuda sería muy apreciada.

 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

Más detalles Ejemplo

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Respuesta actualizada

Gracias por la aclaración, puedes hacer lo que quieras si guardas lo siguiente como monty.sh y lo haces ejecutable con:

 chmod +x monty.sh

Aquí está el código:

 #!/bin/bash # Goto first subdirectory and take it off args list cd "$1" shift # Grab remaining directory names into array friends=( "$@" ) >$2 echo "DEBUG: friends=${friends[@]}" # Iterate over files in first directory for this in *.tiff ; do >&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}" >&2 echo "DEBUG: next=$next" if [ -f "$next" ] ; then echo "$next" else >&2 echo "ERROR: file $next is missing" fi done } | magick montage -tile 3x @- ../"${this/tiff/png}" done

Entonces tu comando será:

 ./monty.sh Output1 Output2 Output3

o, más sucintamente:

 ./monty.sh Output{1,2,3}

En caso de que no esté familiarizado con la sintaxis de bash , el código en medio del ciclo for básicamente está haciendo:

 ... ... { echo first filename to montage onto stdout echo second filename to montage onto stdout echo third filename to montage onto stdout } | magick montage <ALL FILENAMES ON STDIN> result.png

Por lo tanto, es importante que todos los mensajes de error dentro de {...} se envíen a stderr ; de lo contrario, los mensajes de error irán al comando de montage que los interpretará como nombres de archivo. Es por eso que todas las declaraciones de depuración comienzan con >&2 echo ... porque eso las dirige a stderr para que no se mezclen con stdout .


Respuesta Original

No entiendo lo que está tratando de hacer, pero si puede escribir todos los nombres de archivo en el stdin de ImageMagick , puede hacer que los monte así:

 find . -name "*.tif" -print | magick montage -geometry +0+0 -tile x3 @- result.png
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda