Ho una directory con oltre 400 GiB di dati. Volevo verificare che tutti i file possano essere letti senza errori, quindi un modo semplice in cui ho pensato era di tarfarlo /dev/null. Ma invece vedo il seguente comportamento:
$ 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
Il terzo comando sopra è stato forzatamente interrotto da Ctrl+ Cdopo essere stato eseguito per un periodo piuttosto lungo. Inoltre, mentre i primi due comandi funzionavano, l'indicatore di attività del dispositivo di memorizzazione contenente .era quasi sempre inattivo. Con il terzo comando l'indicatore è costantemente acceso, il che significa estrema disponibilità.
Quindi sembra che, quando tarè in grado di scoprire che il suo file di output è /dev/null, cioè quando /dev/nullviene aperto direttamente per avere l'handle del file su cui tarscrive, il corpo del file appare saltato. (L'aggiunta vdell'opzione tarstampa tutti i file nella directory essendo tar'rosso.)
Quindi mi chiedo, perché è così? È una sorta di ottimizzazione? Se sì, allora perché tardovrei voler fare un'ottimizzazione così dubbia per un caso così speciale?
Sto usando GNU tar 1.26 con glibc 2.27 su Linux 4.14.105 amd64.
pv: tar -cf - | pv >/dev/null. Ciò elude il problema e ti fornisce informazioni sullo stato di avanzamento (le varie pvopzioni)
gtar -cf /dev/zero ...per ottenere quello che ti piace.
find . -type f -exec shasum -a256 -b '{}' +. In realtà non solo legge e esegue il checksum di tutti i dati, ma se memorizzi l'output, puoi rieseguirlo in seguito per verificare che il contenuto dei file non sia cambiato.