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

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

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

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

Обратите внимание play Команда от программного обеспечения SoX.

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

команда playRandom

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

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

Как я могу достичь этой цели? Заранее спасибо.

3 ответа

Решение

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

Поскольку 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
find ./ -type f | sort -R | tee text.file | xargs -I + play +  

Также см man tee,

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

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 в вашем текущем каталоге, который содержит все названия треков.

Другие вопросы по тегам