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é à tarcela 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 tarest en mesure de découvrir que son fichier de sortie est /dev/null, c'est-à-dire lorsqu'il /dev/nullest directement ouvert pour avoir le descripteur de fichier dans lequel il tarécrit, le corps du fichier semble ignoré. (L'ajout d'une voption pour tarimprimer 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 tarmê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 pvoptions)
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é.