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 doneRespuesta 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.shAquí 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}" doneEntonces tu comando será:
./monty.sh Output1 Output2 Output3o, 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