Deduplicar archivos usando la línea de comando en OSX Lion

4

Estoy usando OSX 10.8.4 y me gustaría eliminar archivos duplicados en un solo directorio plano si un hash md5 coincide.

He buscado varias respuestas, pero ninguna de ellas me funciona, creo que debido a las diferencias en la sintaxis de comandos entre las versiones de terminal.

Cosas que he probado:

http://www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/

Encontrar y eliminar archivos duplicados en osx con un script

y algunos de estos: http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash#comment

Este enfoque se siente más cercano:

find . -size 20 \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif - /tmp/f.tmp > duplicates.txt

Pero me sale un error: grep: -: No such file or directory

Tras la inspección, /tmp/f.tmp existe. El archivo duplicates.txt se crea pero está vacío.

¿Cómo deduplicar estos archivos?

SimplGy
fuente
Si no se opone al uso de un script, checkout dupinator, es un script de Python que podría realizar esta tarea. code.activestate.com/recipes/362459
spuder
Intenté esto. no encuentra duplicados en una carpeta de prueba que tiene duplicados intencionales. El comentario 6 también señala un error de pérdida de datos: code.activestate.com/recipes/362459/#c6
SimplGy

Respuestas:

1

De manera predeterminada, en Mac OS obtendrá BSD grep, mientras que el comando que ha publicado es probablemente para GNU grep. Las dos versiones de las herramientas son similares, pero no idénticas. Esto también es cierto para otras herramientas (por ejemplo, las versiones de GNU y BSD también se datecomportan de manera ligeramente diferente).

El problema es el -siguiente comando grep. GNU grepinterpreta esto como stdin(por lo tanto, aquellas líneas que han sido identificadas como duplicadas por uniq -d), mientras que BSD grepestá buscando un momento llamado -; de ahí el mensaje de error:

>> find . \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif - /tmp/f.tmp
grep: -: No such file or directory

Lo mismo sucede si reemplaza el -con otro nombre que no coincide con ningún archivo:

>> find . \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif unknown-file /tmp/f.tmp
grep: unknown-file: No such file or directory

De que puede en bash sustitución proceso para alimentar a la salida estándar del todo hasta el uniqque grepcomo un archivo, por ejemplo, (se me ha caído el criterio de tamaño en este ejemplo, pero el resto es lo mismo):

>> grep -hif <(find . \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d) /tmp/f.tmp
4192268874 275 ./foo/META-INF/leiningen/foo/foo/project.clj
4192268874 275 ./foo/project.clj
sinistral
fuente
4

Encontrar duplicados basados ​​en hashkey funciona bien y es muy rápido. Yo uso el siguiente código a menudo. Si está ejecutando esto en una Mac y enfrenta algún problema, instale las herramientas de GNU y use la segunda versión.

Linux

find -not -empty -type f -printf "% s \ n" | sort -rn | uniq -d | xargs -I {} -n1 find -type f -size {} c -print0 | xargs -0 md5sum | ordenar | uniq -w32 --all-repetido = separado

Versión para Mac

gfind -not -empty -type f -printf "% s \ n" | sort -rn | guniq -d | xargs -I {} -n1 find -type f -size {} c -print0 | xargs -0 gmd5sum | ordenar | guniq -w32 --all-repetido = separado

kumar
fuente
Gracias, eso ayudó! El uniq -w32es realmente la pieza que faltaba en el rompecabezas - sin coincidencia de líneas parcial, la búsqueda de duplicados es significativamente más difícil (sobre todo en un lenguaje shell).
piojo