3 votes

linux tar -T - ne fonctionne pas à la volée

J'ai trouvé un problème avec linux gnu tar. Lorsque j'utilise l'option

-T -  (for file list from stdin) or
-T named_pipe_file    ,

cela ne fonctionne pas à la volée. par exemple, un simple script interactif :

while read x; do echo $x; done|\
tar cvf tar.tar -T -

tar ne commence à archiver que lorsque j'appuie sur ^D pour marquer l'entrée EOF la même situation se produit lorsque j'utilise named pipe :

mkfifo named_pipe
tar cvf tar.tar -T named_pipe
while read x; do echo $x; done >named_pipe

Il semble que le goudron fasse de la mise en mémoire tampon. Mais combien de temps cela dure-t-il ? Je dois repacker beaucoup de fichiers en TAR mais j'ai peu d'espace disque. Je dois donc le faire à la volée. Je voulais utiliser l'option tar --remove-files pour cela. Mais sans interactivité pour l'option -T, c'est impossible. Dans le plan, la partie "while" du code devrait décompresser les fichiers les uns après les autres et attendre que TAR les supprime, puis le fichier suivant. Merci pour vos idées :)

ma version de tar : tar (GNU tar) 1.26 (C) 2011 FSF

3voto

wingedsubmariner Points 1472

tar est capable de s'ajouter à des archives déjà existantes, donc vous pourriez faire :

touch tarfile.tar
command_that_produces_file_list | xargs tar rf tarfile.tar

Malheureusement, cela ne fonctionne pas avec la compression à la volée. Heureusement, le tar Le format est assez simple pour qu'on puisse le pirater :

command_that_produces_file_list | {
  xargs -i sh -c 'tar c {} | head -c $(( (`stat --printf="%s" {}` + 511) / 512 * 512 + 512))';
  dd if=/dev/zero bs=512 count=2 2>/dev/null;
} | compression_utility

tar La sortie consiste, pour chaque fichier, en un en-tête de 512 octets suivi de suffisamment de blocs de 512 octets pour contenir les données du fichier. Il ajoute ensuite au moins 2 blocs de 512 octets de zéros. Ce que fait ce code est de capturer la sortie de tar et de supprimer les blocs de zéros supplémentaires, de combiner la sortie des multiples invocations de tar ensemble, puis colle les blocs de zéros terminaux. La sortie est envoyée par le tuyau à l'utilitaire de compression, qui s'exécute en même temps que l'application tar s.

2voto

Znik Points 329

Bonne nouvelle. J'ai obtenu une réponse à mon rapport de bogue à bug-tar@gnu.org , cite :

De : Sergey Poznyakoff date :
Thu, 05 Sep 2013 08:40:40 +0300 sujet : Re : [Bug-tar] gnu tar, l'option -T depuis stdin ou named pipe n'est pas interactive

Bonjour Grzegorz,

Ceci a été corrigé dans le HEAD git (à partir de commit 1fe0c83d).

Salutations, Sergey

Alors j'attends que cela soit corrigé dans les distros linux :)

0voto

Lisez cette explication (première réponse) : Dans quel ordre les commandes pipées s'exécutent-elles ?

Ce que vous voyez, c'est que tar attend que la liste d'entrée soit complétée avant de commencer le traitement. On peut dire que faire le traitement en parallèle avec l'entrée, un par un, pourrait être utile, mais je ne pense pas que GNU Tar le supporte.

Je ne peux que supposer que le fait d'attendre la liste complète est fait pour éviter la complexité des "procédures internes" de traitement des arguments de ligne de commande - tels que comment faire face à "--append et --remove-files". Je pense que la plupart des gens préfèrent supprimer tous les fichiers en bloc. après l'archive est faite, et non pas à la volée comme il est souhaitable dans ce cas.

Les gens de GNU sont généralement très amicaux, vous pouvez demander pourquoi ce n'est pas une fonctionnalité, comment vous pouvez le faire avec d'autres outils et même demander que cela fasse partie de Tar dans le futur ;

https://lists.gnu.org/mailman/listinfo/help-tar

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X