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