Я нашел из это сообщение в Stackoverflow, если вы просто хотите получить список соответствующих файлов, содержимое которых отличается, вы можете выполнить:
diff --brief --recursive dir1/ dir2/
... и, попробовав это сам, получился небольшой список файлов, содержимое которых отличается.
Но если я сделал резервную копию исходной файловой системы (предположим, что файловая система БОЛЬШОЙ, например, 2 ТБ), и я хотел проверить, совпадает ли резервная копия с оригиналом (например, я хочу проверить, успешно ли выполнено резервное копирование), что я должен бежать, если меня интересует только то, какие файлы НЕ доступны с обеих сторон? Я хочу что-то, что проверяет деревья каталогов БЫСТРО (без проверки содержимого).
Хотя сравнение размера файла не дает абсолютного указания на то, является ли файл резервной копии другим, сравнение этих и других метаданных, не относящихся к файлу, во время команды сравнения может помочь.
(Приношу свои извинения за повторную публикацию очень похожего вопроса, но я заметил, что пользователь утверждал, что вопрос, возможно, не по теме, поэтому этот вопрос определенно будет в stackoverflow.)
Есть опыт по этому поводу?
Вы не говорите нам, какое решение для резервного копирования вы используете, но почти все настоящие программы резервного копирования имеют режим «проверки». («Настоящим» инструментом резервного копирования в данном контексте является что-то вроде Bacula, программное обеспечение, специально разработанное для резервного копирования и восстановления).
При прочих равных я бы предложил использовать реальное программное обеспечение для резервного копирования и его встроенные инструменты проверки.
При прочих равных условиях, rsync -nav --delete <backup> <original>
было бы моим предложением.
это делает проверьте содержимое и сообщит вам о дополнительных файлах, различных файлах и недостающих файлах. Это не так глубоко (медленно), как diff
, а -n
означает, что он фактически не коснется файловой системы.
Решение без поддержки rsync, которое проверяет время модификации и размер файла:
diff <(find dir1 -mindepth 1 -printf '%P %t %s\n' | sort) <(find dir2 -mindepth 1 -printf '%P %t %s\n' | sort) | grep -E '^[<>]'
Пример вывода:
> bar Sat Sep 14 11:52:33.0544384394 2013 91
< foo Fri Sep 13 17:58:21.0213671425 2013 445
> foo Sun Sep 8 23:01:02.0355432619 2013 347
Показывает, что foo
был изменен в dir1
и bar
существует только в dir2
.
В результате ответов, приведенных выше, я придумал следующий небольшой сценарий, которым хотел поделиться:
# vi /bin/checkbackup
#!/bin/bash
echo "1/5: Checking source files..."
find "$1" -type f -printf "%P %s\n" | sort > ~/.checkbackup_files.tmp
echo "2/5: Comparing destination files..."
find "$2" -type f -printf "%P %s\n" | sort | diff - ~/.checkbackup_files.tmp
echo "3/5: Checking source directories..."
find "$1" -type d -printf "%P\n" | sort > ~/.checkbackup_dirs.tmp
echo "4/5: Comparing destination directories..."
find "$2" -type d -printf "%P\n" | sort | diff - ~/.checkbackup_dirs.tmp
echo "5/5: Cleaning up"
rm -f ~/.checkbackup_files.tmp
rm -f ~/.checkbackup_dirs.tmp
# chmod 755 /bin/checkbackup
Использование:
$ checkbackup /path/to/dir1 /path/to/dir2
Отсутствие отчетов означает, что структура и имена папок совпадают, а файлы имеют одинаковый размер и одинаковые имена, без каких-либо пропусков.
Протестировано на деревьях каталогов 1,5 ТБ на дисках SATA2 5400 об / мин, время завершения составляет примерно 5 минут.
Этот сценарий никоим образом не закончен, несомненно, есть другие, более качественные, быстрые и более подробные инструменты с большим количеством проверочных инструментов. Но я думал, что все равно поделюсь им.