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