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.jpg
y photo1s.jpg
. Lo hice, rm */photo*s.jpg
pero terminó porque algunos de los archivos nombrados photoXs.jpg
eran 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 -R
cada 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
find
comandos 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 file
find
comando. Olvidé incluir una-maxdepth
discusión.find --version
te da? ¿Qué distribución de Linux (y versión)?find /path/to/main/branch -type d | while read subdir; do (cd "$subdir" && ~/bin/imagedirstats ); done
Si 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 -delete
Es 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
cut
utilidad 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