Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

189
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda