Использование случайного файла в папке? - PullRequest
1 голос
/ 20 апреля 2020

Прямо сейчас мой скрипт выглядит так:

ffmpeg -re -stream_loop -1 -i videos/fitness"$(( RANDOM % 8 ))".mp4

Он ищет все видео в моей папке, которые начинаются с "fitness".

fitness1.mp4

fitness2.mp4

fitness3.mp4

и так далее ...

и случайным образом принимает значение 1 между 1-8 ( im using /fitness"$(( RANDOM % 8 ))".mp4 )

Есть ли способ просто использовать случайный файл mp4 из папки, независимо от того, как его зовут?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Shuf

Используйте команду shuf:

shuf -en1 dir/*.mp4

Если у вас нет shuf (например, в BSD), вы можете написать свой собственный shuf -en1 очень легко:

shufen1() {
    shift "$((RANDOM % $#))" # slightly biased towards small numbers, at most 32767
    printf %s\\n "$1"
}

Чистое bash решение с использованием массивов

Для полноты, вот чистое bash решение. Однако это имеет те же проблемы, что и самописная функция shufen1.

a=(dir/*.mp4)
printf %s\\n "${a[RANDOM % ${#a[@]}]}"

Использование этих решений

Обе команды работают при условии, что существует хотя бы один файл mp4 написано строчными буквами. Вы можете использовать сопоставление без учета регистра, используя shopt -s nocaseglob.

. Возможно, вы захотите установить shopt -s failglob, чтобы получить ошибку, если такого файла нет, в противном случае будет напечатана литеральная строка dir/*.mp4.

Чтобы использовать любое из этих решений, запишите их в подоболочку:

ffmpeg -re -stream_loop -1 -i "$(shuf -en1 videos/*.mp4)"
ffmpeg -re -stream_loop -1 -i "$(a=(videos/*.mp4); printf %s\\n "${a[RANDOM % ${#a[@]}]}")"
1 голос
/ 20 апреля 2020
find videos -type f -name '*.mp4' | shuf -n1

Найти файлы с именем *.mp4, случайным образом переставить список имен и вывести одно имя файла.

ffmpeg -re -stream_loop -1 -i "$(find videos -type f -name '*.mp4' | shuf -n1)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...