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 play
comando es deSoXsoftware.
Ahora el resultado se parece a esto:
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 play
comando finaliza después de reproducir un solo archivo, lo que podemos hacer es en lugar de usar xargs
y proporcionar play
un 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'' -r
comandos 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.txt
aparecer en find
el comando de cambio de salida find
de este modo:
find ./ -type f -not -name "playlist.txt" -print0
Además, si queremos asegurarnos de que solo .mp3
se 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 play
a través de la estructura xargs
o 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 play
comando, 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
readlink
obtenemos el nombre del archivo - usando
soxi
obtenemos su información - usando
grep
cortamos 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_names
en su directorio actual que contiene todos los nombres de las pistas.