1

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

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

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

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

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

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

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

2 ответа2

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
-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, оставив уникальные файлы. Если вы используете пробелы в именах файлов, вам нужно использовать другой разделитель, чем тот, который я использовал для разделителя вырезок.

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