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

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

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 playcomando é deSoXProgramas.

Agora a saída é mais ou menos assim:

Comando playRandom

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 playcomando termina após a reprodução de um único arquivo, o que podemos fazer é, em vez de usar xargse fornecer playum 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'' -rcomandos 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.txtser listado no comando findde alteração de saída findda seguinte forma:

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

Além disso, se quisermos garantir que apenas .mp3os 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 playvia xargsou novamente via while IFS= read -r ; do ... doneestrutura

#!/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 playcomando, 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 readlinkobtemos o nome do arquivo
  • usando soxiobtemos suas informações
  • usando grepcortamos 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_namesem seu diretório atual que contém todos os nomes das faixas.

informação relacionada