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

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

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

2 ответа2

0

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

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

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

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

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

0

Следующее должно 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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .