Tengo una gran cantidad (más de 400) de directorios llenos de fotos. Lo que quiero hacer es mantener los tamaños más grandes de estas fotos. Cada directorio tiene de 31 a 66 archivos.
Cada directorio tiene miniaturas y versiones más grandes, además de un archivo llamado example.jpg
Envié el archivo example.jpg fácilmente con:
rm */example.jpg
Inicialmente pensé que sería fácil eliminar las miniaturas, pero el problema es que no tienen nombres consistentes. El patrón típico era photo1.jpgy photo1s.jpg. Lo hice, rm */photo*s.jpgpero terminó porque algunos de los archivos nombrados photoXs.jpgeran en realidad más grandes y no más pequeños. Argh
Entonces, lo que quiero hacer es escanear cada directorio en busca de tamaño de archivo y eliminar (o mover) las miniaturas. Inicialmente pensé que simplemente ls -Rcada archivo y extraer el tamaño de cada archivo y guardarlos por debajo de un umbral. ¿El problema? En un directorio, el tamaño grande será de 1.1 MB y el pulgar es de 200k. En otro, el grande es de 200k y el pequeño de 30k.
Peor aún, los archivos realmente se nombran principalmente photo1.jpg, por lo que simplemente ponerlos todos en la misma carpeta, ordenarlos por tamaño y eliminarlos en grupos ya no funcionaría sin renombrarlos, y si es posible, preferiría mantenerlos en sus carpetas.
Casi estaba decidido a hacer todo esto manualmente, pero luego pensé en preguntar aquí.
¿Cómo harías esta tarea?
fuente

Respuestas:
Este script supone que hay una brecha significativa en los tamaños entre los grupos de archivos más pequeños y más grandes. En particular, el más pequeño de los archivos grandes es al menos dos veces más grande que el más grande de los archivos pequeños.
Llame al script "imagedirstats" y ejecútelo en un bucle como este:
para encontrar y eliminar archivos en directorios individuales en el árbol de directorios.
Aquí está el guión:
Editar: movió el aviso de advertencia para que primero se muestre información útil. Se corrigió una falta
fi.Edición 2: hizo que los dos
findcomandos sean consistentes. Se agregó una variación comentada para OS X. Se agregó información sobre cómo ejecutar el script.fuente
imagedirstats:y lo ejecuté~/bin/imagedirstats */*y el resultado es:-bash: /Users/artlung/bin/imagedirstats: Argument list too long...~/bin/imagedirstats *find: illegal option -- p find: illegal option -- r find: illegal option -- i find: illegal option -- n find: illegal option -- t find: %s\n: No such file or directory /Users/artlung/bin/imagedirstats: line 38: syntax error: unexpected end of filefindcomando. Olvidé incluir una-maxdepthdiscusión.find --versionte da? ¿Qué distribución de Linux (y versión)?find /path/to/main/branch -type d | while read subdir; do (cd "$subdir" && ~/bin/imagedirstats ); doneSi puede encontrar un límite específico, por ejemplo, todas las imágenes grandes son mayores de 200 KB, entonces puede hacer esto:
find */*.jpg -size -200k -deleteEs posible que desee hacer una copia de seguridad primero.
fuente
Si los tamaños de archivo no son consistentes, ¿son las dimensiones de la imagen?
Podría usar
identify, una herramienta que viene con ImageMagick, para tomar las dimensiones de la imagen. A través de algunas secuencias de comandos bash simples, puede trabajar con las imágenes según su tamaño.Para capturar el ancho y el alto de una imagen con
identify:obtendrá la salida de esta manera:
Luego puede usar la
cututilidad para obtener los números en su script:fuente
if [ $h -lt 200 ] ...Si desea hacer esto en función del nombre del archivo, intente lo siguiente:
Encontrará cada archivo .jpg, colocará una "s" al final del nombre de archivo (justo antes de ".") Y lo eliminará.
fuente