2009-02-18 7 views
7

Me gustaría cambiar el tamaño de una lista de imágenes, todas en el directorio. Para lograr eso, uso convert de imagemagick. Me gustaría cambiar el tamañoCambiar el tamaño de una lista de imágenes en el comando de línea

image1.jpg 
image2.jpg 
... 

en

image1-resized.jpg 
image2-resized.jpg 
... 

Me preguntaba si hay un método para lograr esto en una sola línea de comandos. Una solución elegante podría ser útil a menudo, no solo en este caso.

EDIT:

me gustaría una solución noguión-como, es decir. sin para bucle

Respuesta

6
ls *.jpg|sed -e 's/\..*//'|xargs -I X convert X.jpg whatever-options X-resized.jpg 

Usted puede eliminar the sed y be extension-generic si está dispuesto a aceptar un nombre de archivo final ligeramente diferente, 'resized-image1.jpg' en lugar de ' imagen1-resized.jpg ':

ls|xargs -I X convert X whatever-options resized-X 
+0

este era el tipo de truco que estaba pensando, bonita;) – claf

+0

¡Correcto! ¡Eso es lo que quiero! Sin la tubería de sed sería perfecto, no importa si el cambio de tamaño es al principio –

10

Si desea cambiar su tamaño a 800x600:

for file in *.jpg; do convert -resize 800x600 -- "$file" "${file%%.jpg}-resized.jpg"; done 

(funciona en bash)

+0

+1 Esto es exactamente lo mismo que yo utilizo –

2

Si los archivos de imagen tienen diferentes extensiones:

 
for f in *; do convert -resize 800x600 -- "$f" "${f%.*}-resized.${f##*.}"; done 
4

GNU Parallel es incluso más fácil que para los bucles, y es a menudo más rápido:

parallel convert -resize 800x600 -- "{}" "{.}-resized.jpg" ::: *.jpg 

Un par de cosas que hacer aquí, de derecha a izquierda:

  • ::: *.jpg significa ejecutar el comando para cada archivo jpg
  • {.} significa insertar el nombre de archivo actual sin el sufijo (.jpg)
  • {} medios insertar el nombre de archivo actual
  • parallel medios ejecute el siguiente comando muchas veces en paralelo. Elegirá el máximo para hacer en paralelo para que coincida con la cantidad de núcleos que tiene su computadora. A medida que cada uno termina, lanzará el siguiente hasta que se conviertan todos los archivos jpg.

Esto ejecuta el comando convert --resize 800x600 -- foo.jpg foo-resized.jpg para cada archivo. El -- le dice a la conversión que pare las banderas de procesamiento, en caso de que un nombre de archivo comience con un -.

P.S. En mi mac tengo Homebrew instalado, así que pude instalar en paralelo y convertir con

brew install parallel 
brew install imagemagick 
+0

Buena respuesta: este es el camino a seguir. Sin embargo, no estoy seguro de qué es la parte '- -'. –

Cuestiones relacionadas