Tengo una carpeta con archivos duplicados (por md5sum
( md5
en una Mac)) y quiero tener uncron trabajo programado para eliminar cualquier encontrado.
Sin embargo, estoy atascado en cómo hacer esto. Lo que tengo hasta ahora:
md5 -r * | sort
Lo que genera algo como esto:
04c5d52b7acdfbecd5f3bdd8a39bf8fb gordondam_en-au11915031300_1366x768.jpg
1e88c6899920d2c192897c886e764fc2 fortbourtange_zh-cn9788197909_1366x768.jpg
266ea304b15bf4a5650f95cf385b16de nebraskasupercell_fr-fr11286079811_1366x768.jpg
324735b755c40d332213899fa545c463 grossescheidegg_en-us10868142387_1366x768.jpg
3993028fcea692328e097de50b26f540 Soyuz Spacecraft Rolled Out For Launch of One Year Crew.png
677bcd6006a305f4601bfb27699403b0 lechaustria_zh-cn7190263094_1366x768.jpg
80d03451b88ec29bff7d48f292a25ce6 ontariosunrise_en-ca10284703762_1366x768.jpg
b6d9d24531bc62d2a26244d24624c4b1 manateeday_row10617199289_1366x768.jpg
ca1486dbdb31ef6af83e5a40809ec561 Grueling Coursework.jpg
cdf26393577ac2a61b6ce85d22daed24 Star trails over Mauna Kea.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x768.jpg
dc3ad6658d8f8155c74054991910f39c smoocave_en-au10358472670_1366x7682.jpg
¿Cómo puedo procesar según el MD5 del archivo para eliminar duplicados? Realmente no me importa qué "original" conserve, pero solo quiero conservar uno.
¿Debería abordar esto de una manera diferente?
bash
shell-script
hashsum
duplicate
madriguera
fuente
fuente
fdupes
comando que hará esto ... No estoy seguro de en qué distribución estás, pero está en un paquete Debian con el mismo nombre. Además, MD5 es un hash bastante débil hoy en día; probablemente desee usarsha256sum
o mejorsha512sum
(que en realidad debería ser más rápido en hardware de PC normal)Respuestas:
Estoy trabajando en Linux, lo que significa que es el comando
md5sum
que genera:Ahora usando
awk
yxargs
el comando sería:La
awk
parte se inicializalasthash
con la cadena vacía, que no coincidirá con ningún hash, y luego verifica para cada línea si el hash inlasthash
es el mismo que el hash (primera columna) del archivo actual (segunda columna). Si es así, lo imprime. Al final de cada paso, se establecerálasthash
en el hash del archivo actual (puede limitar esto para que solo se configure si los hashes son diferentes, pero eso debería ser algo menor, especialmente si no tiene muchos archivos coincidentes). Los nombres de archivo que awk escupe se alimentanrm
conxargs
, lo que básicamente llamarm
con lo que laawk
parte nos da.Probablemente necesite filtrar directorios antes
md5sum *
.Editar:
Usando el método Marcins también puedes usar este:
Esto resta de la lista de archivos obtenida por
ls
el primer nombre de archivo de cada hash único obtenido pormd5sum * | sort -k1 | uniq -w 32 | awk '{print $2}'
.fuente
md5 -r * | sort -t ' ' -k 4 -r | awk 'BEGIN{lasthash = ""} $1 == lasthash {print $2} {lasthash = $1}' | xargs rm
es la llamada en OS X (según la sugerencia de @ Stephen Kitt , puse unaecho 'will remove '
al final antes de intentarlorm
)sort -t ' ' -k 4 -r
asort
.Puede identificar archivos duplicados con el siguiente comando:
fuente
Me encontré con fdupes como respuesta a esta pregunta similar: /superuser/386199/how-to-remove-duplicated-files-in-a-directory
Pude
apt-get install fdupes
en Ubuntu. Definitivamente querrás leer la página del manual. En mi caso, pude obtener los resultados deseados así:fdupes -qdN -r /ops/backup/
Lo que dice "mire recursivamente a través de / ops / backup y encuentre todos los archivos duplicados: conserve la primera copia de cualquier archivo dado y elimine silenciosamente el resto". Esto hace que sea muy fácil mantener varios volcados de una base de datos de escritura poco frecuente.
fuente
Si tiene prisa (o tiene muchos archivos) y quiere evitar la sobrecarga de una especie (lleva tiempo) pero no le importa la sobrecarga de memoria de una tabla hash (o tiene un montón de ram con sus lotes de archivos),
find . -type f -print0
: Encuentre todos los archivos y envíelos con nombres nulosxargs -0 md5sum
: calcule hashes en paralelo (ajuste-n
max-args y-P
max-procs como desee, veaman xargs
)awk 'h[$1]{ printf "%s\0", $2; next }{ h[$1] = $2 }'
: si hay una entrada en la tabla hash awk que contiene el md5sum que estamos viendo actualmente, imprima el nombre del archivo que estamos viendo actualmente, con terminación nula. De lo contrario, agregue el nombre del archivo a la tabla hash.xargs -0 rm
: tome las cadenas terminadas en nulo canalizadas y envíelas a rm.Esto es mucho más rápido que fdupes.
Si tiene un nombre de archivo que contiene una nueva línea, awk probablemente lo truncará en la nueva línea ya que md5sum también separa los registros por nuevas líneas.
Esto se basa en /programming/11532157/remove-duplicate-lines-without-sorting y /programming/9133315/how-can-i-output-null-terminated- cuerdas en awk
fuente
fuente
caracteristicas:
ls
con un tipo o--color=always
fuente