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 tartym 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 tarjest w stanie dowiedzieć się, że jego plik wyjściowy jest /dev/null, tzn. Kiedy /dev/nulljest bezpośrednio otwierany, aby mieć uchwyt pliku, w którym tarzapisuje, ciało wydaje się pominięte. (Dodanie vopcji tarpowoduje wydrukowanie wszystkich plików w katalogu na tarczerwono).
Zastanawiam się więc, dlaczego tak jest? Czy to jakaś optymalizacja? Jeśli tak, to dlaczego miałby tarchcieć 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 pvopcje)
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.