J'ai trouvé un problème avec linux gnu tar. quand j'utilise l'option
-T - (for file list from stdin) or
-T named_pipe_file ,
ça ne marche pas à la volée. par exemple, un script interactif simple:
while read x; do echo $x; done|\
tar cvf tar.tar -T -
tar commence l'archivage uniquement lorsque j'appuie sur ^ D pour marquer l'entrée EOF. La même situation se présente lorsque j'utilise un canal nommé:
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 c'est combien de temps? Je dois remballer beaucoup de fichiers dans TAR mais avoir peu d’espace disque. Ensuite, je dois le faire à la volée. Je vais utiliser l'option tar --remove-files pour cela. Mais sans interactivité pour l'option -T, c'est impossible. Dans le plan, une partie du code "while" doit décompresser le fichier dans un fichier et attendre que TAR soit supprimé et le fichier suivant. Merci pour les idées :)
ma version de tar: tar (GNU tar) 1.26 (C) 2011 FSF
tar
noms de fichiers ou les données réelles à compresser? L'-T
option attend une liste de noms de fichiers et fonctionne comme annoncé dans une boucle sur mon système.Réponses:
tar
est capable d’ajouter à des archives déjà existantes, vous pouvez donc faire:Malheureusement, cela ne fonctionne pas avec la compression à la volée. Heureusement, le
tar
format est assez simple, nous pouvons faire du piratage:tar
la sortie consiste en, pour chaque fichier, 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 zéros de 512 octets. Ce code capture la sortie de la commande tar et supprime les blocs de zéros supplémentaires, combine la sortie des appels multiples effectuéstar
ensemble, puis se colle sur les blocs de zéros terminés. La sortie est envoyée en aval à l'utilitaire de compression, qui s'exécute en même temps que la commandetar
s.la source
Bonnes nouvelles. Je reçois la réponse pour mon rapport de bogue à [email protected], cite:
Ensuite, j'attends que cela soit corrigé dans les distributions linux :)
la source
Lisez cette explication (première réponse): Dans quel ordre les commandes piped sont-elles exécutées?
Ce que vous voyez, c’est un blocage de tar pour l’achèvement de la liste d’entrée avant le début du traitement. 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 peux seulement deviner que l’attente de la liste complète est terminée afin d’éviter toute complexité dans les "procédures internes" de traitement des arguments en ligne de commande - telles que la procédure à suivre pour "--append and --remove-files". Je pense que la plupart des gens préfèrent supprimer tous les fichiers en masse une fois l’archive terminée, et non à la volée comme il est souhaitable dans ce cas.
Les gens de GNU sont généralement très sympathiques, vous pouvez vous 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 à l’avenir;
https://lists.gnu.org/mailman/listinfo/help-tar
la source