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