Поиск уникальных файлов на 2 дисках

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

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

Я попытался это:

find /Volumes/1/ /Volumes/2/ -not -empty -type f -printf "%Dt%st%fn" | sort -t$'t' -k2 -n | uniq -uf1 | sort

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

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

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

5
задан Ze'ev
источник

2 ответов

EDIT: ответ относительно необходимости сохранения устройства

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
0
отвечен GnP 2014-02-16 23:47:39
источник

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

rsync -rvcnR --delete path_to_sync/ path_to_orig/

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

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

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

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

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

-1
отвечен Antony 2014-03-10 06:42:15
источник

Другие вопросы bash deduplication linux