![¿Cómo eliminar archivos del mismo tamaño en un directorio en Linux?](https://rvso.com/image/164714/%C2%BFC%C3%B3mo%20eliminar%20archivos%20del%20mismo%20tama%C3%B1o%20en%20un%20directorio%20en%20Linux%3F.png)
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 -zuDw20
informa todas las entradas, excepto la última, con los primeros 20 bytes duplicados.
Retire el echo
cuando esté satisfecho.
Entre las cosas que hiciste mal:
read -d '' i
debiera serIFS= read -rd '' i
. VerEntendiendo "IFS= leer -r línea"%f
es 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.