GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo copiar imágenes de forma masiva solo de cierto tamaño en Linux

He aquí un problema interesante, o un requisito, por así decirlo. Tienes una carpeta llena de imágenes, digamos docenas o cientos. Y son de diferentes tamaños, digamos una altura de 480 o 600 o 1024 píxeles y una anchura de 200, 320 o 9000 píxeles, y le gustaría copiar solo imágenes de gran tamaño y alta calidad de esta carpeta en una ubicación separada . Hacer esto manualmente puede ser una tarea.

En este artículo, me gustaría mostrarle un comando relativamente simple que puede ejecutar en una ventana de terminal, que le permitirá filtrar sus imágenes por tamaño y luego copiar solo aquellas con un atributo que le guste. Ahora, tenga en cuenta que hay docenas de formas diferentes de lograr esto, y mi solución no es única ni completa (para cada caso de uso posible), pero debería funcionar bien. Comencemos.

Herramientas del oficio

La única aplicación que necesitará, además de las diversas herramientas de línea de comandos predeterminadas de Linux, es ImageMagick, que es un paquete/conjunto de utilidades de procesamiento de imágenes. Se instala en la mayoría de las distribuciones de forma inmediata, por lo que no tendrá que hacer nada en la mayoría de los escenarios.

Una frase

Ahora, el comando que necesitas es este:

ls*.FFF | xargs -I{} identificar -formato '%i %w %h\n' {} | grep -w XXX | awk '{imprimir $1}' | grep-v ^$ | xargs -I cp {} "carpeta de destino"

¿Qué tenemos aquí?

Aquí está el desglose de las diferentes acciones:

  • Primero enumeramos todos los archivos con la extensión FFF (*.FFF) en la carpeta actual. Por supuesto, puede cambiar esto a cualquier directorio que desee, o usar un método más sofisticado para buscar/ubicar archivos, como el comando de búsqueda.
  • Luego, usamos xargs con reemplazo de cadena y canalizamos los nombres a la utilidad de identificación de la suite ImageMagick, que procesa cada nombre de archivo e imprime los atributos en el formato '%i %w %h\n', lo que significa:nombre de archivo, ancho, alto, carácter de nueva línea, por lo que separamos la salida para cada entrada. Aquí, tiene libertad de expresión:¡solo puede buscar ancho o alto u otras propiedades!
  • Luego, agrupamos las entradas de palabras completas (-w) que coinciden con un tamaño determinado, por ejemplo:ancho (640). Puede egrep para capturar valores múltiples, si lo desea, o incluso usar expresiones regulares.
  • A continuación, solo imprimimos los nombres de archivo de los archivos que coinciden con el calificador grep anterior. De hecho, imprimimos el primer valor con awk, ya que la salida del comando es en realidad un carácter de nueva línea de ancho de alto de nombre de archivo, como en:

archivo1.jpg 640 480
archivo2.jpg 320 200

  • A continuación, filtramos las líneas vacías; en mis pruebas, a veces, identifique imprimía líneas vacías, por lo que no las queremos en nuestros resultados.
  • Luego, pasamos los nombres de archivo a xargs una vez más y los copiamos en una carpeta de destino, que debe existir. Usamos la opción -I (también puede usar la opción obsoleta -i) para asegurarnos de que los nombres de archivo se analicen correctamente. De lo contrario, es posible que encuentre el siguiente error:

cp:target './file.jpg' no es un directorio

Dos líneas

Lo anterior debería funcionar muy bien, pero si encuentra un problema debido a las delicadas diferencias en la forma en que las herramientas analizan los nombres de archivo, las líneas vacías y los caracteres de nueva línea, puede simplificar una línea en dos líneas, donde primero escribe los resultados en un archivo de texto y luego analice el archivo de texto para copiar:

ls*.FFF | xargs -I{} identificar -formato '%i %w %h\n' {} | grep -w XXX | awk '{imprimir $1}' | lista de camisetas.txt

lista de gatos.txt | grep-v ^$ | xargs -I cp {} "carpeta de destino"

Por ejemplo, copiamos todas las imágenes PNG con cualquier dimensión establecida en 800 px:

ls *.png | xargs -I{} identificar -formato '%i %w %h\n' {} | grep -w 800 | awk '{imprimir $1}' | lista de camisetas.txt

lista de gatos.txt | grep-v ^$ | xargs -I cp {} ./dir-solo-archivos-grandes

Conclusión

Allá. Ahora, estoy seguro de que puede proponer una docena de métodos y ajustes diferentes que lograrán lo mismo, quizás incluso de manera más elegante que lo que escribí. Si es así, envíeme un correo electrónico con sus sugerencias y podría agregarlas a este tutorial. El propósito de este artículo no es ser el santo grial de la escritura, sino una solución simple para una necesidad común. Y hace bien su trabajo.

De todos modos, si tiene toneladas de imágenes, fotos, capturas de pantalla, lo que sea, de diferentes tamaños y atributos, puede usar la línea de comandos de Linux para filtrarlas de manera inteligente, además del comando de identificación de ImageMagick. Incluso estamos hablando de cosas como el tamaño, el mapeo de colores y más. ruido Con suerte, encontrará esto bastante útil. Cuídate.


Linux
  1. Cómo crear archivos de cierto tamaño en Linux

  2. Cómo administrar los registros de contenedores de Linux

  3. Cómo aumentar el tamaño de intercambio en Ubuntu Linux

  4. Cómo obtener el tamaño del directorio en Linux

  5. ¿Cómo crear un archivo con un tamaño determinado en Linux?

Cómo crear un montaje a partir de imágenes en Linux

Cómo verificar imágenes ISO en Linux

Cómo encontrar el tamaño total de un directorio en Linux

Cómo crear un video a partir de imágenes en Linux

Cómo enumerar solo directorios en Linux

¿Cómo enumerar todos los archivos ordenados por tamaño en Linux?