3

Я использую OSX 10.8.4 и хотел бы удалить дубликаты файлов в одном плоском каталоге, если хэш md5 совпадает.

Я посмотрел несколько ответов, но ни один из них не работает для меня, я думаю, из-за различий в синтаксисе команд между версиями терминала.

Вещи, которые я пробовал:

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

Поиск и удаление дубликатов файлов в OSX с помощью скрипта

и некоторые из них:http://www.commandlinefu.com/commands/view/3555/find-duplicate-files-based-on-size-first-then-md5-hash#comment

Этот подход чувствует себя ближе всего:

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

Но я получаю сообщение об ошибке: grep: -: No such file or directory

После проверки /tmp/f.tmp существует. Файл duplicates.txt создан, но пуст.

Как мне дедуплицировать эти файлы?

2 ответа2

3

Поиск дубликатов на основе хэш-ключа работает хорошо и очень быстро. Я часто использую следующий код. Если вы используете это на Mac и столкнулись с какими-либо проблемами, установите инструменты GNU и используйте вторую версию.

Linux

find -not -empty -type f -printf "% s\n" | сортировать -rn | uniq -d | xargs -I {} -n1 find -type f -size {} c -print0 | xargs -0 md5sum | сортировать | uniq -w32 --all-repeat = Отдельный

Версия для Mac

gfind -not -empty -type f -printf "% s\n" | сортировать -rn | guniq -d | xargs -I {} -n1 find -type f -size {} c -print0 | xargs -0 gmd5sum | сортировать | guniq -w32 - все повторяется = отдельно

1

По умолчанию в Mac OS вы получаете BSD grep , а отправленная вами команда, скорее всего, предназначена для GNU grep . Две версии инструментов похожи, но не идентичны. Это верно и для других инструментов (например, версии date в GNU и BSD тоже ведут себя немного по-разному).

Проблема заключается в - после команды grep. GNU grep интерпретирует это как stdin (таким образом, те строки, которые были определены как дубликаты с помощью uniq -d), в то время как BSD grep фактически ищет, что называется - ; отсюда и сообщение об ошибке:

>> 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

То же самое происходит, если вы замените - другим именем, которое не соответствует ни одному файлу:

>> 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

Вы можете использовать процесс подстановки в bash для подачи stdout из всего, вплоть до uniq в grep в виде файла, например (Я опустил критерий размера в этом примере, но остальное то же самое):

>> 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .