Benennung der Datei anhand des Inhalts der Terminalausgabe

Benennung der Datei anhand des Inhalts der Terminalausgabe

Dieser ThreadHierbesprochen, wie Terminalinhalte in eine Datei ausgegeben werden. Insbesondere mit diesem:

command |& tee output.txt

Frage: Ist es möglich, einen Teil des Ausgabeinhalts zur Benennung der Datei zu verwenden? Angenommen, der Inhalt wird zeilenweise wie folgt ausgedruckt:

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

Ist es möglich, den Inhalt der letzten Zeile zum Benennen der Datei zu verwenden, anstatt ihn out.txtin der Befehlszeile zu verwenden? Vielleicht eine Art Variable? Hier wird angenommen, dass die letzte Zeile als die Zeile definiert ist, die unmittelbar vor dem Schließen der Datei (und dem Beenden der Befehlsausführung) erscheint.

Antwort1

Wie auch immer Sie das Problem lösen, Sie müssen die Befehlsausgabe puffern, bis Sie die letzte Zeile lesen können, um zu wissen, wohin Sie sie schreiben müssen.

Die einzige sinnvolle Möglichkeit, die mir hierfür einfällt, besteht darin, eine temporäre Datei zu verwenden und diese dann umzubenennen:

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

Sie können |zu ändern |&, wenn Sie wirklich sowohl stdout als auch stderr erfassen möchten - aber beachten Sie, dass diesMaiführt dazu, dass die Ausgabedatei nach einer Fehlermeldung benannt wird (obwohl es wahrscheinlich eine Möglichkeit gibt, dies mit dem cleveren Dateideskriptor „fu“ zu vermeiden).

Es ist möglicherweise möglich, eine alternative Lösung mit dem spongeBefehl (aus dem Paket moreutils) zu implementieren, aber diese verwendet wahrscheinlich im Hintergrund dieselbe Technik. Tatsächlich heißt es in der Manpage:

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

Eine andere Möglichkeit wäre, revdie Zeilen umzukehren, so dass Sie zuerst die letzte Zeile lesen und dann revdie Ausgabereihenfolge wiederherstellen können. Dies erfordert jedoch die Pufferung der gesamten Ausgabezweimal.

verwandte Informationen