У мене є каталог із понад 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 '{}' +. Мало того, що він на самому справі читати і контрольну суму всіх даних, але якщо ви зберігаєте на вихід, ви можете повторно запустити його пізніше , щоб перевірити , що вміст файлів не змінилися.