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

794
Eukleyv Cardoso

У меня есть скрипт bash

while true ; do for i in * ; do cp "$i" ~/slideshow.jpg ; echo $i ; sleep 5 ; done ; done 

Как я могу рандомизировать этот процесс?

0

2 ответа на вопрос

0
James T Snell

Я чувствую, что этот вопрос - домашнее задание. Позволь мне сделать это для тебя.

*в этом сценарии скорее всего возвращается алфавитный список каталога. Таким образом, вы можете перехватить этот список и рандомизировать в этот момент.

Вы также можете загрузить содержимое каталога в массив, выбрать случайным образом число - изменить размер массива и, если результат будет пустым, двигаться вперед до тех пор, пока вы не нажмете непустую запись. Затем очистите эту запись по мере ее использования. Вам понадобится счетчик или что-то еще, чтобы потом отслеживать, сколько элементов вы использовали, чтобы вы знали, когда вы использовали все записи.

Кроме того, вы можете вместо этого загрузить записи во что-то вроде связанного списка и создать случайную запись # для использования, а затем отбросить из структуры данных.

Вероятно, есть много других вариантов. Но я только что дал вам наброски для 3 грубых подходов. Конечно, я не написал код для вас, но я сделал сложную часть. Пожалуйста ;)

Нет, это не домашняя работа. Я художник, который плохо знаком с Linux и нуждается в слайд-шоу, которое позволяет мне контролировать задержку между изображениями и рандомизировать ее для жестовых рисунков. Я скопировал этот скрипт из этой ветки http://superuser.com/a/212838/458779 Я разместил его здесь, чтобы попросить о помощи, потому что мне не разрешено комментировать в этой ветке. Итак, я ничего не знаю. Eukleyv Cardoso 7 лет назад 0
0
Carlos Sánchez de La Lama

Следующее должно AFAIK работать на любой системе POSIX.

Случайный упорядоченный список файлов можно получить с помощью:

for i in *; do echo "$i"; done | \ awk 'BEGIN { OFS="\t"; srand (); } { print rand (), $0 }' | \ sort | \ cut -f2- 

Объяснение:

  • for i in *; do echo "$i"; done дает список файлов, по одному на строку.
  • awk 'BEGIN { OFS="\t"; srand (); } { print rand (), $0 }' добавляет поле со случайным числом в диапазоне [0,1) к каждой строке.
  • sort сортирует, используя это случайное число в качестве индекса, поэтому рандомизирует список файлов.
  • cut -f2- удаляет поле случайного числа.

Исходная команда (с копированием и сном) может быть построена следующим образом:

for i in $(for i in *; do echo "$i"; done | \ awk 'BEGIN { OFS="\t"; srand (); } { print rand (), $0 }' | \ sort | \ cut -f2-); \ do \ cp "$i" ~/slideshow.jpg; \ echo "$i"; \ sleep 5; \ done 

Конечно, вы можете удалить обратную косую черту и новые строки, если вам нравятся однострочные;)

Похожие вопросы