1 votes

Nommer un fichier en utilisant le contenu de la sortie du terminal

Ce fil aquí a discuté de la manière de sortir le contenu d'un terminal vers un fichier. En particulier, avec ceci :

command |& tee output.txt

Question : est-il possible d'utiliser une partie du contenu de la sortie pour nommer le fichier. Par exemple, supposons que le contenu soit imprimé ligne par ligne comme suit :

action_1_last_time_2021_06_15_21_34_56
action_2_last_time_2021_06_15_21_35_23
action_3_last_time_2021_06_15_21_43_45
...
action_320032_last_time_2021_06_15_23_59_14

Est-il possible d'utiliser le contenu de la dernière ligne pour nommer le fichier, au lieu de out.txt sur la ligne de commande ? Une sorte de variable, peut-être ? Ici, on suppose que la dernière ligne est définie comme celle qui apparaît juste avant la fermeture du fichier (et la fin de l'exécution de la commande).

5voto

steeldriver Points 118154

Quelle que soit la façon dont vous résolvez ce problème, vous devrez mettre en mémoire tampon la sortie de la commande jusqu'à ce que vous puissiez lire la dernière ligne, afin de savoir où l'écrire.

La seule façon judicieuse de procéder est d'utiliser un fichier temporaire, puis de le renommer :

tmpfile=$(mktemp)
outfile=$(command | tee "$tmpfile" | tail -n 1)
mv "$tmpfile" "$outfile"

Vous pouvez modifier | a |& si vous voulez vraiment capturer à la fois stdout et stderr - mais soyez conscient que ce mai a pour conséquence de nommer le fichier de sortie d'après un message d'erreur (bien qu'il y ait probablement un moyen d'éviter cela en utilisant un descripteur de fichier fu intelligent).

Il peut être possible de mettre en œuvre une autre solution en utilisant le système de gestion des déchets de l'UE. sponge (du paquet moreutils ) mais qui utilise probablement la même technique sous le capot. En fait, la page de manuel dit

   When possible, sponge creates or updates the output file atomically by
   renaming a temp file into place.

Une autre option pourrait être d'utiliser rev pour inverser les lignes afin de pouvoir lire la dernière ligne en premier, et ensuite rev à nouveau pour rétablir l'ordre de sortie. Cependant, cela implique de mettre en mémoire tampon toute la sortie deux fois .

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