¿Es posible encontrar archivos duplicados en mi disco que sean bit a bit idénticos pero que tengan nombres de archivo diferentes?
fuente
¿Es posible encontrar archivos duplicados en mi disco que sean bit a bit idénticos pero que tengan nombres de archivo diferentes?
fdupes
puede hacer esto De man fdupes
:
Busca en la ruta dada archivos duplicados. Dichos archivos se encuentran comparando tamaños de archivo y firmas MD5, seguidos de una comparación byte por byte.
En Debian o Ubuntu, puede instalarlo con apt-get install fdupes
. En Fedora / Red Hat / CentOS, puede instalarlo con yum install fdupes
. En Arch Linux se puede utilizar pacman -S fdupes
, y en Gentoo, emerge fdupes
.
Para ejecutar una verificación descendente desde la raíz de su sistema de archivos, que probablemente tomará una cantidad significativa de tiempo y memoria, use algo como fdupes -r /
.
Como se preguntó en los comentarios, puede obtener los duplicados más grandes haciendo lo siguiente:
fdupes -r . | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n
Esto se romperá si sus nombres de archivo contienen nuevas líneas.
fdupes ....... | xargs ls -alhd | egrep 'M |G '
para mantener los archivos en formato legible para humanos y solo aquellos con tamaño en Megabytes o Gigabytes. Cambie el comando para adaptarse a las salidas reales.
du
canalizado a sort
le dirá.
Otra buena herramienta es fslint
:
fslint es un conjunto de herramientas para encontrar varios problemas con los sistemas de archivos, incluidos archivos duplicados y nombres de archivos problemáticos, etc.
Las herramientas de línea de comandos individuales están disponibles además de la GUI y para acceder a ellas, se puede cambiar o agregar a $ PATH el directorio / usr / share / fslint / fslint en una instalación estándar. Cada uno de estos comandos en ese directorio tiene una opción --help que detalla más sus parámetros.
findup - find DUPlicate files
En sistemas basados en Debian, puede instalarlo con:
sudo apt-get install fslint
También puede hacerlo manualmente si no desea o no puede instalar herramientas de terceros. La mayoría de los programas funcionan calculando sumas de comprobación de archivos . Los archivos con el mismo md5sum casi seguramente contienen exactamente los mismos datos. Entonces, podrías hacer algo como esto:
find / -type f -exec md5sum {} \; > md5sums
gawk '{print $1}' md5sums | sort | uniq -d > dupes
while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes
Salida de muestra (los nombres de archivo en este ejemplo son los mismos, pero también funcionarán cuando sean diferentes):
$ while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes
---
/usr/src/linux-headers-3.2.0-3-common/include/linux/if_bonding.h
/usr/src/linux-headers-3.2.0-4-common/include/linux/if_bonding.h
---
/usr/src/linux-headers-3.2.0-3-common/include/linux/route.h
/usr/src/linux-headers-3.2.0-4-common/include/linux/route.h
---
/usr/src/linux-headers-3.2.0-3-common/include/drm/Kbuild
/usr/src/linux-headers-3.2.0-4-common/include/drm/Kbuild
---
Esto será mucho más lento que las herramientas dedicadas ya mencionadas, pero funcionará.
st_size
, eliminando cualquiera que solo tenga un archivo de este tamaño y luego calculando md5sums solo entre archivos con el mismo st_size
.
md5sum {}
con md5 -q {}
y gawk '{print $1}'
concat
Respuesta corta: sí.
Versión más larga: eche un vistazo a la entrada de wikipedia fdupes , tiene una lista bastante buena de soluciones listas para usar . Por supuesto, usted puede escribir su propia, no es que difícil - programas de hash como diff
, sha*sum
, find
, sort
y uniq
debe hacer el trabajo. Incluso puede ponerlo en una línea, y seguirá siendo comprensible.
Si cree que una función hash (aquí MD5) no tiene colisión en su dominio:
find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
| cut --characters=35-
¿Quieres nombres de archivo idénticos agrupados? Escriba un script simple not_uniq.sh
para formatear la salida:
#!/bin/bash
last_checksum=0
while read line; do
checksum=${line:0:32}
filename=${line:34}
if [ $checksum == $last_checksum ]; then
if [ ${last_filename:-0} != '0' ]; then
echo $last_filename
unset last_filename
fi
echo $filename
else
if [ ${last_filename:-0} == '0' ]; then
echo "======="
fi
last_filename=$filename
fi
last_checksum=$checksum
done
Luego cambie el find
comando para usar su script:
chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh
Esta es una idea básica. Probablemente debería cambiar find
si sus nombres de archivo contienen algunos caracteres. (por ejemplo, espacio)
Pensé agregar una bifurcación mejorada reciente de fdupes, jdupes , que promete ser más rápida y más rica en funciones que los fdupes (por ejemplo, filtro de tamaño):
jdupes . -rS -X size-:50m > myjdups.txt
Esto buscará de forma recursiva archivos duplicados de más de 50 MB en el directorio actual y generará la lista resultante en myjdups.txt.
Tenga en cuenta que el resultado no está ordenado por tamaño y, dado que parece no estar integrado, he adaptado la respuesta @Chris_Down anterior para lograr esto:
jdupes -r . -X size-:50m | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n > myjdups_sorted.txt
Wikipedia tenía un artículo ( http://en.wikipedia.org/wiki/List_of_duplicate_file_finders ), con una lista de software de código abierto disponible para esta tarea, pero ahora se ha eliminado .
Agregaré que la versión GUI de fslint es muy interesante, ya que permite usar la máscara para seleccionar qué archivos eliminar. Muy útil para limpiar fotos duplicadas.
En Linux puedes usar:
- FSLint: http://www.pixelbeat.org/fslint/
- FDupes: https://en.wikipedia.org/wiki/Fdupes
- DupeGuru: https://www.hardcoded.net/dupeguru/
Los 2 últimos trabajos en muchos sistemas (Windows, Mac y Linux) no he verificado FSLint
Aquí está mi opinión sobre eso:
find -type f -size +3M -print0 | while IFS= read -r -d '' i; do
echo -n '.'
if grep -q "$i" md5-partial.txt; then echo -e "\n$i ---- Already counted, skipping."; continue; fi
MD5=`dd bs=1M count=1 if="$i" status=noxfer | md5sum`
MD5=`echo $MD5 | cut -d' ' -f1`
if grep "$MD5" md5-partial.txt; then echo "\n$i ---- Possible duplicate"; fi
echo $MD5 $i >> md5-partial.txt
done
Es diferente en el sentido de que solo divide hasta el primer 1 MB del archivo.
Esto tiene algunos problemas / características:
Lo uso para comparar videoclips, así que esto es suficiente para mí.
st_size
s coincidentes , eliminando aquellos con solo uno de los mismos, y luego calculando solo md5sums parast_size
s s coincidentes .