Nombrar archivos usando el contenido de la salida del terminal

Nombrar archivos usando el contenido de la salida del terminal

este hiloaquíSe analizó cómo enviar el contenido del terminal a un archivo. En concreto, con esto:

command |& tee output.txt

Pregunta: ¿es posible utilizar parte del contenido de salida para nombrar el archivo? Por ejemplo, supongamos que el contenido se imprime línea por línea de la siguiente manera:

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

¿Es posible utilizar el contenido de la última línea para nombrar el archivo, en lugar de hacerlo out.txten la línea de comando? ¿Algún tipo de variable, tal vez? Aquí, se supone que la última línea está definida como la que aparece justo antes de que se cierre el archivo (y el comando termine de ejecutarse).

Respuesta1

Independientemente de cómo resuelva esto, tendrá que almacenar en buffer la salida del comando hasta que pueda leer la última línea, para saber dónde escribirla.

La única forma sensata que se me ocurre de hacer esto es usar un archivo temporal y luego cambiarle el nombre:

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

Puede cambiar |a |&si realmente desea capturar tanto stdout como stderr, pero tenga en cuenta que estopuederesultará en nombrar el archivo de salida después de un mensaje de error (aunque probablemente haya una manera de evitarlo usando el descriptor de archivo inteligente fu).

Es posible implementar una solución alternativa usando el spongecomando (del paquete moreutils), pero probablemente use la misma técnica interna. De hecho, la página de manual dice

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

Otra opción podría ser utilizar revpara invertir las líneas para que pueda leer la última línea primero y luego revnuevamente para restaurar el orden de salida. Sin embargo, eso implica almacenar en búfer toda la salida.dos veces.

información relacionada