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

Это сводится к способности сохранить dynamic output (Я объясню) терминала в текстовый файл, но вот то, что я в конечном счете ищу.

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

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

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

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

playRandom command

Поскольку Вы видите выходные изменения dynamically, таким образом, я не могу использовать >> сохранить вывод.

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

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

4
задан 3 June 2017 в 13:20

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
10
ответ дан 23 November 2019 в 11:35
find ./ -type f | sort -R | tee text.file | xargs -I + play +  

Также см. man tee.

8
ответ дан 23 November 2019 в 11:35

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

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

3
ответ дан 23 November 2019 в 11:35

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

Похожие вопросы: