Альтернитивное решение:
find ./ -type f | ( i=0; while read line; do lines[i++]="$line"; done; mplayer "${lines[$RANDOM % $i]}" )
Не нужно модифицировать рандом под количество файлов и find'у можно дописать кучу условий выборки
Конструкция сплошь из башизмов и GNU-only вещей :)
$RANDOM нет в sh, он есть только в bash. Массивов в sh тоже нет, как нет и упрощенных арифметических операций — портабельный инкремент, например:
I=$(($I+1))
Предложенный оригинальным автором shuf — вообще GNU-only утилита. sort с аргументами типа -R (он же --random-sort) есть далеко не везде, *даже* если используется GNU sort.
Вообще есть хорошее обсуждение вопроса как выбрать случайный файл из набора на stackoverflow. По большому счету всё сводится к тому, что единственный действительно портабельный вариант — сделать это на awk.
JFYI, в современнейшем и популярнейшем Ubuntu, sh уже давно не bash, а dash. В не менее современнейшем Debian — собственно, тоже.
awk мне тоже не особенно нравится и иллюзий по поводу его портабельности я не питаю; реалистично — относительно портабельны полноценные скриптовые языки типа perl / python / ruby / php — примерно в порядке перечисления реалистично их встретить…
Обычно можно поставить в виде какого-нибудь пакета типа bsdutils. GNU coreutils включают в себя функциональный аналог jot под названием seq, поэтому все обычно им пользуются…
Зачем? Обычный человек отличает по высоте (какой ниже, и какой выше) два тона с разницей менее 6 Гц. Многие отличают звуки и с меньшей разницей частоты. Поэтому отличить два полутона с помощь относительного слуха — не проблема.
Тут речь шла о совершенно другом — воспроизвести только одну ноту и определить, что это за нота. Вторую воспроизводить нет смысла — тогда сразу можно будет понять с помощью относительного слуха, если знаешь, что их там только две. Тут же воспроизводится только одна нота, и, чтобы определить, какая, нужно использовать абсолютный слух.
habrahabr.ru/blogs/linux/108223/#comment_3424415
А для подкаталогов, возможно, к ls добавить -R. Поправьте, если что)
PS Для случайной смены обоев:
cp `ls -1 ~/Изображения/Обои/*.jpg | shuf -n1` ~/Изображения/Обои/.RandomWallpaper.jpg
Кстати, по комментариям очень хорошо можно выделить два совершенно разных стиля программирования — один стремится к «техническому совершенству» (то, что работает на наибольшем количестве платформ, либо по каким-то причинам кажется автору более технически правильным), а другой — к простоте, лёгкости восприятия человеком.
Воспроизведение случайного файла? Одна строчка на bash