Escriba la salida dinámica del terminal en un archivo de texto

Escriba la salida dinámica del terminal en un archivo de texto

Todo se reduce a poder guardar dynamic output(lo explicaré) del terminal en un archivo de texto, pero esto es lo que finalmente busco.

Creé un comando personalizado para terminal llamado playRandom, lo que hace es reproducir canciones aleatorias para siempre. El archivo bash que creé para esto:

#!/bin/bash 
find ./ -type f | sort -R | xargs -I + play +

Nota: El playcomando es deSoXsoftware.

Ahora el resultado se parece a esto:

reproducircomando aleatorio

Como puede ver, la salida cambia dynamically, por lo que no puedo usarla >>para guardar la salida.

Quiero poder guardar los "nombres de las canciones que se reproducen" en un archivo de texto.

¿Cómo puedo lograr este objetivo? Gracias de antemano.

Respuesta1

Guardar nombres de archivos que se reproducen actualmente

Dado que el playcomando finaliza después de reproducir un solo archivo, lo que podemos hacer es en lugar de usar xargsy proporcionar playun lote de archivos, sacaremos cada archivo, uno a la vez, lo repetiremos en el archivo y reproduciremos el archivo después. El guión editado se vería como se muestra a continuación. Tenga en cuenta que aquí se agregan opciones y IFS= read -d'' -rcomandos adicionales para tratar los nombres de archivos de manera segura.

#!/bin/bash 

# create file for playing songs first
echo > playlist.txt

# Now play each song and echo filename to file
find ./ -type f -print0 | sort -z -R | while IFS= read -d '' -r filename
do
    clear
    echo "$filename" >> playlist.txt
    play "$filename"
done

La ventaja de este enfoque es que los nombres de archivos irán al playlist.txt a medida que se reproduzcan, lo que nos permite rastrear la salida del script en tiempo real con algo como tail -F playlist.txt.

NOTA: para evitar playlist.txtaparecer en findel comando de cambio de salida findde este modo:

find ./ -type f -not -name "playlist.txt" -print0

Además, si queremos asegurarnos de que solo .mp3se enumeren los archivos, podemos hacer esto:

find ./ -type f \( -not -name "playlist.txt" -and -name "*.mp3" \) -print0

Guardar lista de archivos encontrados para reproducir

Si nuestro objetivo es proteger la lista de archivosantesse reproduce, no hay mucha ciencia en ello: la canalización de búsqueda y clasificación se puede escribir primero en un archivo, y ese archivo luego se puede enviar playa través de la estructura xargso nuevamente a través de ella.while IFS= read -r ; do ... done

#!/bin/bash 

find ./ -type f -print0 | sort -z -R > playlist.txt

while IFS= read -d '' -r filename
do
    clear
    play "$filename"
done < playlist.txt

Respuesta2

find ./ -type f | sort -R | tee text.file | xargs -I + play +  

Ver también man tee.

Respuesta3

Aquí está mi solución:

1. Tiempo real (actualmente en reproducción)

Después de ejecutar el playcomando, use esto:

soxi "$(readlink /proc/`pidof play`/fd/3)" | grep -Po "(?<=Title=).*"

Le devolverá el nombre de la canción que se está reproduciendo actualmente y podrá redirigirla a un archivo usando >.

1.1. Notas

/proc/`pidof play`/fd/3
  • es el descriptor de archivo de la pista (archivo) que se está reproduciendo actualmente.
  • usando readlinkobtenemos el nombre del archivo
  • usando soxiobtenemos su información
  • usando grepcortamos el título de la pista

2. Antes de jugar (Enumere todos los nombres)

find ./ -type f | sort -R | tee /tmp/play-files | xargs -I + soxi "+"\
| grep -Po "(?<=Title=).*" > list_of_names && xargs < /tmp/play-files\
-I + play "+"

Creará un archivo nombrado list_of_namesen su directorio actual que contiene todos los nombres de las pistas.

información relacionada