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