Tengo algo bastante simple que quiero hacer. Quiero usar montage
en un directorio que contenga miles de imágenes, con muy pocas opciones, a saber:
me@home$ montage -size 256x256 DSC01*.JPG.svg output.png
... pero eso no es lo suficientemente bueno, ya que solo toma alrededor de 100 imágenes a la vez; tampoco es
me@home$ montage -size 256x256 *.svg output.png
... que captura todas las imágenes al mismo tiempo, ya que el archivo resultante es demasiado grande para analizar.
Lo que quiero hacer es iterar sobre algo como 100-200 archivos a la vez. Supongo que esto podría implementarse usando un bucle for (?), Pero estoy un poco confundido acerca de cómo hacerlo. Supongo que probablemente haya una forma inteligente de usar find -exec
o xargs
que no estoy pensando. Estoy usando bash
, pero lo uso zsh
ocasionalmente.
Entonces, en conclusión, estoy buscando un revestimiento que, dado 2600 archivos de imagen, llame al montaje unas 13 o 26 veces (una vez por cada 100-200 archivos), y dado n archivos, se puede llamar un múltiplo de n veces .
fuente
DSC0100.JPG.svg
...DSC2600.JPG.svg
?Respuestas:
Un
bash
método, que utiliza características especiales de la matriz; probablemente traducible azsh
con alguna modificación:fuente
Puedes usar xargs para eso; desafortunadamente, no es posible combinar -I (para aislar en el medio de una línea de comando) y -L (para limitar el número de archivos para una sola llamada al ejecutable). Por lo tanto, creé esta línea de comando como ejemplo (pero tenga cuidado con los caracteres especiales en los nombres de archivo, no son compatibles):
Elimine el
echo
si realmente desea ejecutar el comando.Advertencias:
Actualizar:
Este es el bucle for correspondiente, que (espero) resuelve el problema con espacios en los nombres de archivo:
Actualización 2: una solución de Python, que debería ser inmune a los caracteres especiales en los nombres de archivo
fuente
ls
en una tubería para analizar su salida, también debe advertir sobre los muchos peligros de hacerlo de manera prominente y al principio para asegurarse de que la gente lo vea.*.svg
(por eso publiqué un comentario sobre la pregunta). En el caso más general en el que necesita manejar todos los nombres de archivo, tendría que recurrir al bloqueo de shell y matrices ofind -print0 | xargs -0
construcciones. Vea mi respuesta para un ejemplo de lo anterior.Aquí hay una versión que usa xargs que es segura para cualquier nombre de archivo, pero requiere un archivo temporal para almacenar el conteo. Ajuste el '-n 100' para ajustar cuántos archivos por montaje. También puede intercambiar el "printf" con un "find -print0", pero asegúrese de que no encuentre "count.temp".
fuente
Con GNU Parallel puedes hacer:
Por supuesto, es seguro para archivos con caracteres especiales (como normalmente se puede esperar de GNU Parallel).
Instalación mínima
Si solo necesita paralelo y no tiene 'make' instalado (tal vez el sistema es antiguo o Microsoft Windows):
Mire el video de introducción para una introducción rápida: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1 o en http://tinyogg.com/watch/TORaR/ y http://tinyogg.com/watch/hfxKj / /
fuente