Tudo se resume a ser capaz de salvar dynamic output
(explicarei) o terminal em um arquivo de texto, mas aqui está o que estou procurando.
Criei um comando personalizado para o terminal chamado playRandom
, o que ele faz é tocar músicas aleatórias para sempre. O arquivo bash que criei para isso:
#!/bin/bash
find ./ -type f | sort -R | xargs -I + play +
Nota: O play
comando é deSoXProgramas.
Agora a saída é mais ou menos assim:
Como você pode ver a saída muda dynamically
, não posso usar >>
para salvar a saída.
Quero poder salvar 'nomes das músicas tocadas' em um arquivo de texto.
Como posso atingir esse objetivo? Desde já, obrigado.
Responder1
Salvando nomes de arquivos que estão sendo reproduzidos atualmente
Como o play
comando termina após a reprodução de um único arquivo, o que podemos fazer é, em vez de usar xargs
e fornecer play
um lote de arquivos, retiraremos cada arquivo, um de cada vez, e ecoá-lo-emos no arquivo, e reproduziremos o arquivo depois. O script editado ficaria como abaixo. Observe que aqui são adicionadas opções e IFS= read -d'' -r
comandos adicionais para lidar com nomes de arquivos de maneira 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
A vantagem dessa abordagem é que os nomes dos arquivos irão para playlist.txt à medida que são reproduzidos, o que nos permite rastrear a saída do script em tempo real com algo como tail -F playlist.txt
.
OBSERVAÇÃO: para evitar playlist.txt
ser listado no comando find
de alteração de saída find
da seguinte forma:
find ./ -type f -not -name "playlist.txt" -print0
Além disso, se quisermos garantir que apenas .mp3
os arquivos sejam listados, podemos fazer o seguinte:
find ./ -type f \( -not -name "playlist.txt" -and -name "*.mp3" \) -print0
Salvando lista de arquivos encontrados para serem reproduzidos
Se nosso objetivo é proteger a lista de arquivosantesele é reproduzido, não há muita ciência nisso - o pipeline de localização pode ser gravado no arquivo primeiro, e esse arquivo pode então ser alimentado play
via xargs
ou novamente via while IFS= read -r ; do ... done
estrutura
#!/bin/bash
find ./ -type f -print0 | sort -z -R > playlist.txt
while IFS= read -d '' -r filename
do
clear
play "$filename"
done < playlist.txt
Responder2
find ./ -type f | sort -R | tee text.file | xargs -I + play +
Veja também man tee
.
Responder3
Aqui está minha solução:
1. Tempo real (jogando atualmente)
Depois de executar o play
comando, use isto:
soxi "$(readlink /proc/`pidof play`/fd/3)" | grep -Po "(?<=Title=).*"
Ele retornará o nome da música atualmente tocando para você e você poderá redirecioná-la para um arquivo usando >
.
1.1. Notas
/proc/`pidof play`/fd/3
- é o descritor de arquivo da faixa (arquivo) atualmente reproduzida.
- usando
readlink
obtemos o nome do arquivo - usando
soxi
obtemos suas informações - usando
grep
cortamos o título da faixa
2. Antes de jogar (listar todos os nomes)
find ./ -type f | sort -R | tee /tmp/play-files | xargs -I + soxi "+"\
| grep -Po "(?<=Title=).*" > list_of_names && xargs < /tmp/play-files\
-I + play "+"
Ele criará um arquivo nomeado list_of_names
em seu diretório atual que contém todos os nomes das faixas.