У мене є каталог із понад 400 ГБ даних. Я хотів переконатися, що всі файли можна читати без помилок, тому простий спосіб, який я придумав, був у tar
ньому /dev/null
. Але замість цього я бачу таку поведінку:
$ time tar cf /dev/null .
real 0m4.387s
user 0m3.462s
sys 0m0.185s
$ time tar cf - . > /dev/null
real 0m3.130s
user 0m3.091s
sys 0m0.035s
$ time tar cf - . | cat > /dev/null
^C
real 10m32.985s
user 0m1.942s
sys 0m33.764s
Третю команду вище було насильно зупинено Ctrl+ Cпісля того, як вона вже досить довго бігла. Більше того, в той час, як перші дві команди працювали, індикатор активності пристрою зберігання даних .
майже завжди не працював. Третьою командою індикатор постійно горить, що означає надзвичайну зайнятість.
Отже, здається, що, коли tar
зможе дізнатись, що його вихідний файл є /dev/null
, тобто коли /dev/null
він відкритий безпосередньо, щоб мати обробку файлу, на яку tar
записується, тіло файлу з'являється пропущеним. (Додавання v
опції для tar
друку всіх файлів у каталозі є tar
червоними.)
Тож мені цікаво, чому це так? Це якась оптимізація? Якщо так, то навіщо tar
взагалі хотіти робити таку сумнівну оптимізацію для такого особливого випадку?
Я використовую GNU tar 1.26 з glibc 2.27 в Linux 4.14.105 amd64.
pv
: tar -cf - | pv >/dev/null
. Це вирішує проблему і надає інформацію про хід (різні pv
варіанти)
gtar -cf /dev/zero ...
для отримання того, що вам подобається.
find . -type f -exec shasum -a256 -b '{}' +
. Мало того, що він на самому справі читати і контрольну суму всіх даних, але якщо ви зберігаєте на вихід, ви можете повторно запустити його пізніше , щоб перевірити , що вміст файлів не змінилися.