Записать динамический вывод терминала в текстовый файл

Записать динамический вывод терминала в текстовый файл

Все сводится к возможности сохранения dynamic output(я объясню) терминала в текстовый файл, но вот что я в конечном итоге ищу.

Я создал пользовательскую команду для терминала под названием playRandom, она делает то, что она вечно проигрывает случайные песни. Файл bash, который я создал для этого:

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

Примечание: playкоманда исходит отSoXпрограммное обеспечение.

Теперь вывод выглядит примерно так:

команда playRandom

Как вы видите, выходные данные изменились dynamically, поэтому я не могу использовать >>функцию сохранения выходных данных.

Я хочу иметь возможность сохранять «названия воспроизводимых песен» в текстовый файл.

Как мне достичь этой цели? Спасибо заранее.

решение1

Сохранение имен файлов, которые воспроизводятся в данный момент

Поскольку playкоманда завершается после воспроизведения одного файла, то вместо использования xargsи предоставления playпакета файлов мы можем взять каждый файл по одному и вывести его в файл, а затем воспроизвести файл. Отредактированный скрипт будет выглядеть следующим образом. Обратите внимание, что здесь добавлены дополнительные параметры и IFS= read -d'' -rкоманда для безопасной работы с именами файлов.

#!/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

Преимущество этого подхода в том, что имена файлов будут попадать в playlist.txt по мере их воспроизведения, что позволяет нам отслеживать вывод скрипта в режиме реального времени с помощью чего-то вроде tail -F playlist.txt.

ПРИМЕЧАНИЕ: чтобы избежать playlist.txtпопадания в список в команде findизменения выходных данных findследующим образом:

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

Кроме того, если мы хотим убедиться, что .mp3в списке отображаются только файлы, мы можем сделать следующее:

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

Сохранение списка найденных файлов для воспроизведения

Если наша цель — сохранить список файловдов него играют, в этом нет ничего сложного - конвейер поиска-сортировки можно сначала записать в файл, а затем этот файл можно передать playлибо через xargs, либо снова через 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

решение2

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

Также см man tee.

решение3

Вот мое решение:

1. Реальное время (Текущий воспроизводится)

После выполнения playкоманды используйте это:

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

Он вернет вам название воспроизводимой в данный момент песни, и вы сможете перенаправить ее в файл, используя >.

1.1 Примечания

/proc/`pidof play`/fd/3
  • — это файловый дескриптор текущего воспроизводимого трека (файла).
  • используя readlinkмы получаем имя файла
  • используя soxiмы получаем его информацию
  • используя grepмы вырезаем название трека

2. Перед игрой (перечислите все имена)

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

list_of_namesВ текущем каталоге будет создан файл с именем , содержащий все названия треков.

Связанный контент