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

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

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

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

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

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

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

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

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

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

9 ответов

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

Поскольку команда 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

Кроме того, если мы хотим убедиться, что только [ f13], мы можем это сделать:

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
ответ дан 22 May 2018 в 21:54
  • 1
    Ваш первый подход - это то, что я хочу, спасибо :), но есть проблема . – Amir A. Shabani 4 June 2017 в 01:08
  • 2
    @ AmirA.Shabani извините, должно было быть дополнительное место после опции -d. Я исправлю это через секунду. – Sergiy Kolodyazhnyy 4 June 2017 в 01:59
  • 3
    @ AmirA.Shabani Я также заметил, что скрипт находит файл playlist.txt, т. Е. Находит его собственный вывод. Вы хотите, чтобы я добавил улучшения в скрипт, чтобы команда find игнорировала playlist.txt? – Sergiy Kolodyazhnyy 4 June 2017 в 02:01
  • 4
    Это было бы потрясающе :)) Кстати, теперь скрипт работает, и это именно то, что я хотел. Благодарю. – Amir A. Shabani 4 June 2017 в 02:27
  • 5
    @ AmirA.Shabani приветствую вас, и я рад помочь. Я добавил дополнительные примечания по фильтрации файлов с помощью find – Sergiy Kolodyazhnyy 4 June 2017 в 02:47

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

Поскольку команда 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
ответ дан 18 July 2018 в 12:12

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

Поскольку команда 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
ответ дан 24 July 2018 в 19:55
find ./ -type f | sort -R | tee text.file | xargs -I + play +  

Также см. man tee.

8
ответ дан 22 May 2018 в 21:54

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

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
ответ дан 22 May 2018 в 21:54

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

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
ответ дан 18 July 2018 в 12:12
find ./ -type f | sort -R | tee text.file | xargs -I + play +

Также см. man tee.

8
ответ дан 18 July 2018 в 12:12

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

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
ответ дан 24 July 2018 в 19:55
find ./ -type f | sort -R | tee text.file | xargs -I + play +

Также см. man tee.

8
ответ дан 24 July 2018 в 19:55

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

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