3 votos

Encontrar las imágenes más alto que una resolución específica en un directorio de Linux

Esta es una pregunta de seguimiento de mi anterior pregunta aquí. Necesito encontrar y registro de la ruta de acceso a todos los jpeg imágenes en subdirectorios con una resolución superior a un número específico (por ejemplo, mayor que 800 de ancho).

Bueno, hay millones de imágenes, y me pregunto por qué la find siguiente proceso es tan lento. Así que tengo que optimizar el script de bash para que sea más rápido:

find -type f -regex "^.*\.\(png\|jpg\|jpeg\)$" -exec identify -format "%d/%f, %w, %h\n" {} \; | awk -F ',' '$2 > 800 && $3 > 600'

Pero hay una característica interesante: tengo 4 principales directorios (1 a 4), cada uno exactamente con 256 sub-directorios. Cada una de estas sub-directorios tienen alrededor de 5000 sub-sub-directorios, cada uno con alrededor de 10 imágenes. Por lo que se ve como major_dir/subdir/subsubdir/10.jpg. La característica interesante es que todas las imágenes en estas sub-sub-directorios tienen la misma resolución; así que realmente no necesita para procesar todos estos 10 imágenes. Si la resolución de uno de ellos satisface, entonces yo sería solo necesita iniciar sesión una sola ruta (la sub-sub-ruta de directorio). Con que, con suerte voy a tener 10 veces más rápido que la velocidad. Y además, todas mis fotos son .jpg si que ayuda también.

¿Cómo puedo hacer esto en un script de bash? Por lo tanto un ideal de salida tendría este aspecto (path, width_of_images_there, height)

/path/to/sub_dir1, 1600, 1200
/path/to/sub_dir2, 1600, 1200
/path/to/sub_dir3, 3200, 2400
/path/to/sub_dir4, 1000, 800

2voto

dessert Puntos 928

Cómo acerca de que:

find /path/to/dir_with_major_dirs -path "*/*/*/*.jpg" -type f -exec bash -c '
  for i; do
    [[ "$p" = "${i%/*}" ]] || identify -format "%d, %w, %h\n" "$i"
    p="${i%/*}"
  done' _ {} + |
awk -F ',' '$2 > 800 && $3 > 600'

Esta prueba para cada jpg archivo encontrado si su ruta coincide con la anterior ruta de acceso del archivo y sólo si no se ejecuta identify. La salida se canaliza a awk como usted ya habrá deducido, me quitó /%f de la identify comando para deshacerse de lo innecesario de nombre de archivo.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: