Mam katalog zawierający ponad 400 GiB danych. Chciałem sprawdzić, czy wszystkie pliki można odczytać bez błędów, więc pomyślałem o tar
tym w prosty sposób /dev/null
. Zamiast tego widzę następujące zachowanie:
$ 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
Trzecie polecenie powyżej zostało siłą zatrzymane przez Ctrl+ Cpo długim biegu. Ponadto, podczas gdy pierwsze dwa polecenia działały, wskaźnik aktywności zawierającego urządzenie pamięci masowej .
był prawie zawsze bezczynny. Po trzecim poleceniu wskaźnik świeci się stale, co oznacza ekstremalne zajęcie.
Wygląda więc na to, że gdy tar
jest w stanie dowiedzieć się, że jego plik wyjściowy jest /dev/null
, tzn. Kiedy /dev/null
jest bezpośrednio otwierany, aby mieć uchwyt pliku, w którym tar
zapisuje, ciało wydaje się pominięte. (Dodanie v
opcji tar
powoduje wydrukowanie wszystkich plików w katalogu na tar
czerwono).
Zastanawiam się więc, dlaczego tak jest? Czy to jakaś optymalizacja? Jeśli tak, to dlaczego miałby tar
chcieć dokonać tak wątpliwej optymalizacji tak wyjątkowego przypadku?
Używam GNU tar 1.26 z glibc 2.27 na Linuksie 4.14.105 amd64.
pv
: tar -cf - | pv >/dev/null
. To omija problem i daje informacje o postępie (różne pv
opcje)
gtar -cf /dev/zero ...
aby uzyskać to, co lubisz.
find . -type f -exec shasum -a256 -b '{}' +
. Nie tylko faktycznie odczytuje i sumuje wszystkie dane, ale jeśli przechowujesz dane wyjściowe, możesz je ponownie uruchomić później, aby sprawdzić, czy zawartość plików się nie zmieniła.