Именование файл с использованием содержимого вывода терминала

В этой ветке здесь обсуждалось, как вывести содержимое терминала в файл. В частности, с этим:

command |& tee output.txt

Вопрос: можно ли использовать часть выходного содержимого для имени файла. Например, предположим, что содержимое выводится построчно следующим образом:

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

Можно ли использовать содержимое последней строки для имени файла вместо out.txt в командной строке ? Может быть, какая-то переменная? Здесь предполагается, что последняя строка определяется как строка, которая появляется непосредственно перед закрытием файла (и завершением выполнения команды).

1
задан 15 June 2021 в 23:32

1 ответ

Как бы вы ни решили эту проблему, вам придется буферизировать вывод команды до тех пор, пока вы не сможете прочитать последнюю строку, чтобы знать, куда ее записать.

Единственный разумный способ сделать это - использовать временный файл, а затем переименовать его:

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

Вы можете изменить | на |&, если вы действительно хотите перехватить и stdout, и stderr - но имейте в виду, что это может привести к именованию выходного файла в честь сообщения об ошибке (хотя, вероятно, есть способ избежать этого с помощью умного файлового дескриптора fu).

Возможно, альтернативное решение можно реализовать с помощью команды sponge (из пакета moreutils), но она, скорее всего, использует ту же технику. На самом деле, на странице руководства написано

 Когда это возможно, sponge создает или обновляет выходной файл атомарно путем
 переименовывая временный файл на месте.

Другим вариантом может быть использование rev для реверсирования строк, чтобы вы могли прочитать сначала последнюю строку, а затем rev снова для восстановления порядка вывода. Однако это требует буферизации всего вывода дважды.

5
ответ дан 28 July 2021 в 11:28

Другие вопросы по тегам:

Похожие вопросы: