Произвольный вывод находки с фиксированным начальным числом - PullRequest
2 голосов
/ 17 февраля 2020

Я бы хотел перемешать вывод find НО с фиксированным начальным числом, чтобы при каждом запуске команды получался один и тот же вывод.

Вот как я перетасовываю:

find . -name '*.wav' | shuf

Проблема в том, что каждый раз, когда у нас есть новое семя -> новый порядок. Моя попытка исправить это:

find . -name '*.wav' | shuf --random-source=<(echo 42)

Это работает только в некоторых случаях (т.е. только в нескольких случаях, детерминистически c). В большинстве случаев происходит сбой:

shuf: '/ proc / self / fd / 12': конец файла

Та же ошибка возникает, например,

seq 1 100 | sort -R --random-source=<(echo 42)

То, что я видел, использовалось в других местах .

Хотя это работает:

printf '%s\n' a b c | shuf --random-source=<(echo 42)

Почему это так? И как я могу это исправить? Я открыт для любых предложений. Вывод find является частью большего скрипта. Решение должно работать для bash и zsh.

Почему мое решение не сработало (EDIT)

Благодаря @franzisk и @Inian я думаю, что теперь я понимаю, почему мое первоначальное решение не сработало. Я смотрел на --random-source как на поиск, а это, ну, «случайный источник» = источник случайности. Мой echo 42 просто не дает достаточно энтропии для чего-либо длиннее нескольких строк. Вот почему это сработало только в нескольких случаях!

«Заполнение» (как при отправке) выполняет большое количество байтов, поскольку обеспечивает достаточную энтропию.

1 Ответ

1 голос
/ 17 февраля 2020

Вы можете создать свою функцию fixed_random, используя openssl для генерации потока случайных источников, например:

get_fixed_random()
{
  openssl enc -aes-256-ctr -pass pass:"$1" -nosalt </dev/zero 2>/dev/null
}

Загрузка функции в вашу среду

. /file-containing/get_fixed_random

Запустите команду поиска передайте вывод в shuf, используя функцию random для передачи опции --random-source

find . -name '*.wav'  | shuf --random-source=<(get_fixed_random 55)

Примечание: 55 - это просто переданный параметр seed. Измените его, чтобы изменить случайный результат

...