Grave a saída dinâmica do terminal em um arquivo de texto

4

Tudo se resume em poder salvar o dynamic output (eu explicarei) do terminal em um arquivo de texto, mas aqui está o que eu estou procurando.

Eu 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 +

Observação: o comando play é do software SoX .

Agora, a saída é algo como isto:

Como você pode ver as alterações na saída dynamically , não posso usar >> para salvar a saída.

Eu quero salvar os nomes das músicas tocadas em um arquivo de texto.

Como posso alcançar esse objetivo? Agradecemos antecipadamente.

    
por Amir A. Shabani 03.06.2017 / 22:11

3 respostas

10

Salvando nomes de arquivos que são reproduzidos atualmente

Como o comando play termina após a reprodução de um único arquivo, o que podemos fazer é usar xargs e fornecer play de um lote de arquivos. Removeremos cada arquivo, um de cada vez. e ecoá-lo para arquivar e reproduzir o arquivo depois. O script editado seria semelhante abaixo. Observe que aqui são adicionadas opções adicionais e o comando IFS= read -d'' -r 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 entrarão no playlist.txt enquanto 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 que playlist.txt seja 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 somente .mp3 arquivos sejam listados, podemos fazer isso:

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 arquivos antes de ser reproduzido, não há muita ciência - o pipeline find-sort pode ser gravado primeiro, e esse arquivo pode então ser alimentado para play via xargs ou novamente via while IFS= read -r ; do ... done structure

#!/bin/bash 

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

while IFS= read -d '' -r filename
do
    clear
    play "$filename"
done < playlist.txt
    
por Sergiy Kolodyazhnyy 03.06.2017 / 22:56
8
find ./ -type f | sort -R | tee text.file | xargs -I + play +  

Veja também man tee .

    
por waltinator 03.06.2017 / 22:18
3

Aqui está a minha solução:

1. Tempo real (jogando atualmente)

Depois de executar o comando play , use isto:

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

Ele retornará o nome da música que está sendo reproduzida para você e você poderá redirecioná-lo para um arquivo usando > .

1.1. Notas

/proc/'pidof play'/fd/3
  • é o descritor de arquivo para sua faixa atual (arquivo).
  • 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 chamado list_of_names em seu diretório atual, que contém todos os nomes de faixas.

    
por Ravexina 03.06.2017 / 22:31