Порівняйте масивні каталоги зі звітом про розвиток


13

Я просто rsync-ed 2,000,000 файлів (3TB) з одного RAID в інший.

Я хочу переконатися, що мої дані недоторкані.

rsync -c займає дуже багато часу.

diff не показує мені, що це робить.

Чи є альтернатива, яка (а) швидше, і (б) покаже мені прогрес під час порівняння?

(Я на Mac, і brew search diffдає мені apgdiff colordiff diffstat diffutils fmdiff libxdiff open-vcdiff podiff rfcdiff vbindiff bsdiff diffpdf diffuse dwdiff kdiff3 ndiff perceptualdiff rdiff-backup tkdiff wdiff ... чи зробив би один із них роботу?)



Мене також бентежить питання, чому rsyncскопіювали дані зі швидкістю 150 diffМб / с , але порівнювали зі швидкістю лише 60 Мб / с ...?
День

1
Використання копії rsyncшвидше b / c rsyncза замовчуванням не використовує контрольні суми для порівняння файлів, вона переглядає інформацію про розмір та дату. При використанні rsync -cвсіх файлів потрібно розраховувати контрольні суми, що є обтяжливим завданням, отже, чому це не за замовчуванням.
slm

Так, але diff не копіює ... він просто читає обидва файли; в той час як rsync, щоб скопіювати, повинен прочитати кожен байт, а потім записати його. Це було rsync з нуля, тому воно копіювало кожен файл.
Дан

Відповіді:


6

редагування для виправлення та чіткості опції - я забув '--brief'

diff -rs --brief "$dir1" "$dir2" 

-r, --recursive              recursively compare any subdirectories found
-s, --report-identical-files report when two files are the same
-q, --brief                  report only when files differ
--speed-large-files      assume large files and many scattered small changes

і додайте інші опції за смаком, залежно від того, що ви порівнюєте:

-i, --ignore-case            ignore case differences in file contents
-b, --ignore-space-change    ignore changes in the amount of white space
-B, --ignore-blank-lines     ignore changes whose lines are all blank
--strip-trailing-cr      strip trailing carriage return on input
--ignore-file-name-case  ignore case when comparing file names

diff -rs буде читати кожен байт оригіналу та копії та повідомляти про файли, однакові.

Формат різного виходу визначається POSIX, тому він досить портативний. Ви можете додати щось на кшталт:

| трійник-розріз.1 | grep -v -Ee "Файли. * і. * ідентичні"

Ви можете використовувати chksums чи хеші, але тоді вам доведеться тримати їх синхронізацію з файлами дерев, так що ви все одно повернетесь до читання кожного байта кожного файлу.

EDIT - занадто довго, щоб бути коментарем у відповідь на:

файли понад 10 Гб не підтверджуються

Ви можете спробувати цю різну опцію: --speed-large-файли

Можливо, що diff, який ви використовуєте, не справляється з дуже великими файлами (більшими, ніж системна пам'ять, наприклад), і таким чином повідомляє про відмінності між файлами, які насправді однакові.

Я думав, що є -h варіант або 'bdiff', який краще працює на великих файлах, але я не можу знайти його у Fedora. Я вважаю, що параметри --speed-large-файлів є спадкоємцем параметра "-h" "напівсердечне порівняння".

Іншим підходом було б повторити використану вами команду rsync з '-vin' (багатослівний, детальний, no_run). Це повідомило б про будь-які відмінності, які знайде rsync - і таких не повинно бути.

Щоб перемістити деякі файли, ви шукаєте сценарій на кшталт:

if [ cmp -s "$dir1/$path" "$dir2/$path" ] ; then 
target="$dir2/verified/$path"
mkdir -p $(basename "$target")
mv  "$dir2/$path" "$target"
fi

але я не рекомендую цього робити. Основне питання - "як я можу бути впевненим, що rsync правильно скопіював ієрархію файлів?" і якщо ви можете продемонструвати собі, що rsync працює добре, за допомогою diff або іншого інструменту, то ви можете просто покластися на rsync, а не працювати над цим.

rsync -vin порівнюватиме залежно від будь-яких інших варіантів. Я вважав, що за замовчуванням встановлено контрольну суму, але ви праві, -c або --checksum для цього потрібно.

Утиліта diff дійсно призначена для файлів рядків тексту, але вона повинна повідомляти "однакові" недоліки для двійкових файлів.

Короткий опис повинен придушити будь-який вихідний вміст файлу - мої вибачення за те, що раніше його не помітили - він був напівзахований у потворному сценарії.


Чи є спосіб отримати його до mvкожного знайденого файлу до "перевіреної" папки в корені диска, зберігаючи повний шлях? Наприклад, якщо /disk1/a/b/c/file1він ідентичний /disk2/a/b/c/file1, тоді перемістіть його /disk1/verified/a/b/c/file1. Тоді я міг би отримати лише погано скопійовані файли. (Поки багато файлів понад 10 Гб не перевіряються, що страшно.)
День,

Можливо, ви захочете спробувати цю опцію: --speed-large-files
D McKeon

Що це робить саме?
День

Якщо я запускаю rsync -vin- чи це порівняння байт-байт чи контрольна сума? Я думав, що rsync порівнює лише розмір / дату, якщо ви не додасте -c. І з того, що я прочитав, speed large filesсхоже, лише зміниться непохідні файли ... чи я помиляюся?
День

diffдає мені результати у вигляді "Files __ and ___ differ"... і я запускаю це, sed -e "s/Files /cp -afv /" -e "s/ and / /" -e "s/ differ$//"щоб спробувати створити сценарій для повторної копіювання поганих файлів. Але результат diff не котирується, тому він не працює. Чи можу я змусити мене дати процитовані контури?
День

4

Ось diffзвіт про хід роботи на основі кількості файлів:

diff -rqs dir1 dir2 | pv -l -s filecount > logfile

Вам знадобиться pv (переглядач труб): http://www.ivarch.com/programs/pv.shtml

Пояснення:

  • diff -r рекурсивно порівнюйте каталог та підкаталоги.
  • diff -qдрукуються лише назви файлів файлів. не друкувати фактичні відмінності.
  • diff -sдрукувати також імена файлів, які не відрізняються. це важливо для інформації про хід.
  • pv -l звітувати про хід на основі кількості рядків
  • pv -s count підрахунок часу для завершення на основі підрахунку.
  • Переспрямування на logfileгарний вихід. Інакше висновок з diffбуде змішуватися з рядком стану від pv.

щоб отримати кількість файлів, скористайтеся такою командою:

find dir1 -type f | wc -l

Фільтруйте файл журналу за різними файлами:

grep -v "^Files .* identical$" logfile

Ця версія буде друкувати різні файли в режимі реального часу, а також реєструвати все logfile:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    tee logfile | grep -v "^Files .* identical$"

Крім того, ви можете входити лише в різні файли:

diff -rqs dir1 dir2 | pv -l -s filecount | 
    grep -v "^Files .* identical$" > logfile

Примітка: вищезазначені команди будуть повідомляти про хід роботи на основі кількості файлів. Це найкраще працює, якщо є багато невеликих файлів. Якщо у вас є кілька величезних файлів, ви не будете дуже веселитися з цим.

На жаль, я не знаю простого способу звітувати про прогрес на основі порівняних байтів.


Якщо ви знайдете спокій просто порівнявши метадані (а не власне вміст файлів), то можете скористатися rsync. Це буде значно швидше.

Детальніше:


0

Я хотів би використати якийсь хеш-додаток для перевірки цілісності даних. Я знаю, що багато утилітів пошуку дублікатів файлів використовують хеші для ідентифікації дублікатів / недублікатів. Мені здається, що це розслідування, яке, можливо, варто.


0

Ви можете використовувати rdiff-резервне копіювання для цього. Встановіть його на обох серверах, і він здійснить розумні порівняння контрольних сум і синхронізує те, чого ще немає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.