Это сводится к способности сохранить dynamic output
(Я объясню) терминала в текстовый файл, но вот то, что я в конечном счете ищу.
Я создал пользовательскую команду для названного терминала playRandom
, то, что это делает, - то, что это играет случайные песни навсегда. Файл удара я создал для этого:
#!/bin/bash
find ./ -type f | sort -R | xargs -I + play +
Примечание: play
команда из программного обеспечения SoX.
Теперь вывод выглядит примерно так:
Поскольку Вы видите выходные изменения dynamically
, таким образом, я не могу использовать >>
сохранить вывод.
Я хочу смочь сохранить 'названия песен, которые играются' в текстовый файл.
Как я могу достигнуть этой цели?Заранее спасибо.
Начиная с 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
.
Вот мое решение:
после выполнения play
использование команды это:
soxi "$(readlink /proc/`pidof play`/fd/3)" | grep -Po "(?<=Title=).*"
Это будет возвращать в настоящее время имя песни проигрывания Вас, и Вы можете перенаправить его в файл с помощью >
.
/proc/`pidof play`/fd/3
readlink
мы получаем имя файла soxi
, мы получаем его информацию grep
, мы сокращаем заголовок 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
в Вашем текущем каталоге, который содержит все имена дорожки.