Запишите динамический вывод терминала в текстовый файл
Все сводится к возможности спасти dynamic output
(Я объясню) терминала в текстовом файле, но вот что я в конечном итоге ищу.
Я создал пользовательскую команду для терминала под названием playRandom
Что он делает, так это то, что он играет случайные песни навсегда. Файл bash, который я создал для этого:
#!/bin/bash
find ./ -type f | sort -R | xargs -I + play +
Обратите внимание play
Команда от программного обеспечения SoX.
Теперь вывод выглядит примерно так:
Как вы можете видеть выходные изменения 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
в вашем текущем каталоге, который содержит все названия треков.