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 tar
farlo /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/null
viene aperto direttamente per avere l'handle del file su cui tar
scrive, il corpo del file appare saltato. (L'aggiunta v
dell'opzione tar
stampa tutti i file nella directory essendo tar
'rosso.)
Quindi mi chiedo, perché è così? È una sorta di ottimizzazione? Se sì, allora perché tar
dovrei 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 pv
opzioni)
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.