Как воспроизвести песни .mp3 в случайном порядке, рекурсивно ища их в каталоге и его подкаталогах? - PullRequest
2 голосов
/ 26 июня 2009

Когда я нахожусь в каталоге, содержащем файлы .mp3, я могу воспроизводить песни в произвольном порядке, используя

mpg123 -Z * .mp3

Но если я хочу рекурсивно искать в каталоге и его подпапках файлы .mp3 и воспроизводить их случайным образом, я попытался выполнить следующую команду, но она не работает.

mpg123 -Z <(найти / имя-носителя * .mp3) </p>

(find / media -name * .mp3), при выполнении выдает все файлы .mp3, присутствующие в / media и его подкаталогах.

Ответы [ 9 ]

9 голосов
/ 26 июня 2009
mpg123 -Z $(find -name "*.mp3")

$ (...) означает выполнить команду и вставить сюда вывод.

Также, чтобы обойти ограничение длины командной строки, указанное выше, попробуйте:

mpg123 -Z $ (find -name "* .mp3" | sort --random-sort | head -n 100)

РЕДАКТИРОВАТЬ: Извините, попробуйте:

find -name "*.mp3" | sort --random-sort| head -n 100|xargs -d '\n' mpg123

Это должно правильно работать с пробелами, при условии, что у вас нет имен файлов со встроенными символами новой строки.

Он будет случайным образом переставлять ваш список MP3, затем выбирать первые 100 из случайного списка, а затем передавать их в mpg123.

1 голос
/ 26 июня 2009

В обоих zsh и bash 4.0 ,

mpg123 -Z **/*.mp3

(пользователям Bash, вероятно, потребуется сначала shopt -s globstar.)

1 голос
/ 26 июня 2009

отлично работает следующее.

find / media -name "* .mp3" | xargs -d '\ n' -n10 mpg123 -Z.

Опцией '-n' мы можем предоставить нет. аргументов для одного вызова команды.

Даже после того, как я закрыл терминал, где я написал эту команду, песни продолжают играть, поскольку процесс mpg123 становится сиротой и продолжает работать.

devikasingh @ Интерес: ~ $ ps -e | grep mpg123

                   7239 ?        00:00:01 mpg123

ps -f 7239

UID PID PPID C STIME TTY STAT TIME CMD

1000 7239 1 0 15:21? S 0:01 mpg123 -Z / media / MUSIC & PIC / audio_for_you / For You.mp3 / media / MUSIC & PIC / audio_for_you / In My Place.mp3 /

1 голос
/ 26 июня 2009

Хотелось бы что-нибудь подобное?

find /media -name *.mp3 -print0 | xargs -0 mpg123 -Z
1 голос
/ 26 июня 2009

Обратные кавычки.

mpg123 -Z `find /media -name \*.mp3`

Хотя, если у вас много файлов, вы можете столкнуться с ограничениями длины командной строки.

0 голосов
/ 12 января 2019

Я перепробовал почти все, и когда mpg123 запускается через канал, он возвращает эту ошибку: «Не удается получить атрибуты терминала», и я не могу использовать управляющие клавиши терминала.

Единственный способ найти список файлов, найденных с помощью команды find, и использовать клавиши управления терминалом - это (у меня есть каталоги и файлы с пробелами):

find /media -type f -iname "*.mp3" > /tmp/mp3list
mpg123 -CZvv -@ /tmp/mp3list

Похоже, что mpg123 использует пробел в качестве разделителя, если вы используете $ (find / media -type f -iname "* .mp3") и в моем случае не работает, потому что у меня есть пробелы во всех именах каталогов и почти все имена файлов.

Это скрипт (playmp3.sh), который выполняет поиск только тогда, когда файл не существует:

#!/bin/sh
if ! [ -f /tmp/mp3list ]; then
  find /media -type f -iname "*.mp3" > /tmp/mp3list
fi
mpg123 -CZvv -@ /tmp/mp3list
0 голосов
/ 23 мая 2018

Я нашел это и ИМХО, намного чище, чем другие решения. Кредиты не принадлежат мне, они переходят к владельцу сайта.

find $HOME/mp3s -iname '*.mp3' | mpg123 -Z -@ -

Найдено на https://dannyman.toldme.com/2004/12/28/howto-mpg123-random-mp3s/

Я только что изменил с name на iname, поскольку иногда файлы могут иметь расширение в заглавных буквах ...

0 голосов
/ 17 мая 2016

Возможно, лучше использовать xargs, но я использую цикл while в bash на Red Hat.

find . -iname "*.mp3" -print | sort -R --random-source=/dev/urandom | while IFS= read -r filename; do play "$filename"; done

Единственная проблема в том, что убивать надоедливо. Чтобы убить его, вы должны удерживать нажатой клавишу Ctrl-C, пока цикл while не будет уничтожен.

  • , в то время как ... do ... done проходит через каждое поле в sort output.
  • IFS описывает разделители полей.
  • IFS = делает каждую строку отдельным полем.
  • read копирует текущее поле в переменную filename .
  • Параметр -r удаляет обработку обратной косой черты, которая в Linux не требуется.
  • play - это простой способ использования sox для воспроизведения.
0 голосов
/ 12 сентября 2014

Спасибо за предложения, с их помощью мне удалось создать следующий скрипт:

#!/bin/bash song=$(zenity --width=360 --height=320 --title "Select Folder" --file-selection --directory $HOME) find "$song" -name "*.mp3" | sort --random-sort | head -n 100 | xargs -d '\n' mpg123
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...