¿Cómo eliminar archivos del mismo tamaño en un directorio en Linux?

¿Cómo eliminar archivos del mismo tamaño en un directorio en Linux?

Necesito eliminar archivos con tamaño idéntico pero no con contenido idéntico en Linux, es por eso que fdupes no es una opción.

Probé el siguiente comando, sin embargo, no eliminó todos los archivos con tamaños idénticos (no tengo idea de por qué)

last=-1; find . -type f -name '*.png' -printf '%f\0' | sort -nz | while read -d '' i; do s=$(stat -c '%s' "$i"); [[ $s = $last ]] && rm "$i"; last=$s; done

¿Algunas ideas? ¿Qué hice mal?

EDITAR: cometí un error en la publicación inicial. Necesitomantenerun archivo del tamaño dado, por ejemplo:

1.png    # 23,5 Kb
2.png    # 24,6 Kb
4.png    # 24,6 Kb > remove
8.png    # 24,6 Kb > remove
16.png   # 23,5 Kb

Básicamente quiero eliminar duplicados, pero no solo por suma de verificación ni por tamaño.

Respuesta1

Como parece que estás en un sistema GNU, podrías hacer algo como:

(export LC_ALL=C
find . -name '*.png' -type f -printf '%20s %p\0' |
  sort -z |
  uniq -zuDw20 |
  cut -zb22- |
  xargs -r0 echo rm -f --
)

Eso imprime un tamaño acolchado de 20 caracteres seguido de la ruta del archivo para cada archivo, e uniq -zuDw20informa todas las entradas, excepto la última, con los primeros 20 bytes duplicados.

Retire el echocuando esté satisfecho.

Entre las cosas que hiciste mal:

  • read -d '' idebiera ser IFS= read -rd '' i. VerEntendiendo "IFS= leer -r línea"
  • %fes solo el nombre del archivo, no sus rutas completas, por lo que solo funcionará para los nombres de archivos en el directorio actual.
  • estás comparando el tamaño de un archivo con el tamaño del archivo anterior, pero estás ordenando la lista de archivos por nombre, no por tamaño. Por lo que los archivos del mismo tamaño no necesariamente serán consecutivos en esa lista.

información relacionada