Найти уникальные файлы на двух дисках


1

Я пытаюсь сравнить 2 тома, которые в основном имеют одинаковое содержание, но в совершенно разных структурах папок (Около 2 миллионов файлов.)

Я хочу увидеть, какие файлы находятся ТОЛЬКО в 1 папке, а не в другой - в зависимости от размера & amp; название.

Я попробовал это:

find /Volumes/1/ /Volumes/2/ -not -empty -type f -printf "%D\t%s\t%f\n" | sort -t$'\t' -k2 -n | uniq -uf1 | sort

Идея состоит в том, чтобы получить список всех файлов с указанием устройства, размера и имени, а затем удалить все дубликаты.

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

В идеале я также хотел бы включить полный путь в список результатов, но я не знаю, как включить его, не испортив сортировку / удаление.


Действительно ли вы доверяете двум файлам, чтобы они были идентичными, если они имеют одинаковое имя и размер, или вам также требуется проверка md5 / sha1 / sha2?
MariusMatutiae

Я верю ... так как один диск был недавно отсоединен от другого, но теперь немного беспорядка. Просто ищу остатки, которые нужно скопировать.
Ze'ev

Ответы:


0

РЕДАКТИРОВАТЬ: ответ о необходимости сохранения устройства

find dir1/ dir2/ -type f -printf "%D\t%s\t%f\n" | \
    sort -t$'\t' -k2 | \
    uniq -uf2

find /Volumes/1/ /Volumes/2/ -type f -printf "%f\n" | sort | uniq -u покажет файлы, отсутствующие только по имени файла

find /Volumes/1/ /Volumes/2/ -type f -printf "%s-%f\n" | sort | uniq -u покажет файлы, пропущенные по соответствию имени файла и размера

Вторая опция будет выводить файлы дважды, если есть несоответствие размера. Если это не то, что вы хотите, вы можете отфильтровать список следующим образом:

find /Volumes/1/ /Volumes/2/ -type f -printf "%s\t%f\n" | sort | uniq -u | \
    cut -d$'\t' -f 2|sort|uniq

Да, но тогда я не знаю, с какого диска пришли файлы. Это в основном то, что я имел, без %D для устройства ... Мне нужно, чтобы результаты включали информацию о том, на каком томе находится файл.
Ze'ev

1
@ Зеев, проверь мой отредактированный ответ. Я не был уверен, нужен ли вам дублированный результат в случае несоответствия размера.
GnP

-1

Используйте rsync с -R (относительный параметр, чтобы показать полный путь)

rsync -rvcnR --delete path_to_sync/ path_to_orig/

Другие ключи командной строки r, v, c и n сообщают rsync (проверьте страницу man для подробностей) выполнить подробную, рекурсивную синхронизацию двух каталогов на основе контрольной суммы, но только для show: -n

Отредактируйте, чтобы разрешить удаление и перемещение файлов, которые вызвали повреждение файловой структуры после первоначальной rsync, которую инициатор выяснил после моего ответа.

измените свою находку на что-то вроде этого:

find /Volume/1/ /Volume/2/ -printf '%f %s\t%D%p\n' | sort -uk1,1 | cut -f 2- -d ' '

Используйте printf, чтобы создать первое поле, используя имя файла, за которым следуют поля, которые вам требуются, отсортируйте это первое поле для уникальных файлов, затем удалите поле 1, оставив уникальные файлы. Если вы используете пробелы в именах файлов, вам нужно использовать другой разделитель, чем тот, который я использовал для разделителя вырезок.


Это действительно работает? OP утверждает, что файлы находятся в совершенно разных папках.
MariusMatutiae

@MariusMatutiae, если файлы были помещены туда с помощью rsync, поэтому их можно проверить с помощью rsync.
Antony

Они были впоследствии перемещены. Я начал удалять видимые дубликаты, перемещая их в корзину, а затем обнаружил, что некоторые из них были неправильно определены, поэтому теперь все файлы на первом томе находятся в одной большой папке. Мне нужен rsync, который игнорирует структуру папок. Beyond Compare может это сделать, но задыхается от такой большой работы.
Ze'ev
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.