J'ai un répertoire contenant plus de 400 Gio de données. Je voulais vérifier que tous les fichiers peuvent être lus sans erreur, alors j'ai pensé à tar
cela de manière simple /dev/null
. Mais à la place, je vois le comportement suivant:
$ 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
La troisième commande ci-dessus a été arrêtée de force par Ctrl+ Caprès avoir déjà couru assez longtemps. De plus, alors que les deux premières commandes fonctionnaient, l'indicateur d'activité du périphérique de stockage contenant .
était presque toujours inactif. Avec la troisième commande, l'indicateur est constamment allumé, ce qui signifie une activité extrême.
Il semble donc que, lorsqu'il tar
est en mesure de découvrir que son fichier de sortie est /dev/null
, c'est-à-dire lorsqu'il /dev/null
est directement ouvert pour avoir le descripteur de fichier dans lequel il tar
écrit, le corps du fichier semble ignoré. (L'ajout d'une v
option pour tar
imprimer tous les fichiers du répertoire étant tar
«rouge».)
Je me demande donc, pourquoi en est-il ainsi? Est-ce une sorte d'optimisation? Si oui, alors pourquoi voudrait-il tar
même faire une optimisation aussi douteuse pour un cas si spécial?
J'utilise GNU tar 1.26 avec glibc 2.27 sous Linux 4.14.105 amd64.
pv
: tar -cf - | pv >/dev/null
. Cela évite le problème et vous donne des informations sur la progression (les différentes pv
options)
gtar -cf /dev/zero ...
pour obtenir ce que vous aimez.
find . -type f -exec shasum -a256 -b '{}' +
. Non seulement il ne fait lire et la somme de contrôle toutes les données, mais si vous stockez la sortie, vous pouvez relancer ultérieurement pour vérifier que le contenu des fichiers n'a pas changé.