У меня есть скрипт bash
while true ; do for i in * ; do cp "$i" ~/slideshow.jpg ; echo $i ; sleep 5 ; done ; done
Как я могу рандомизировать этот процесс?
У меня есть скрипт bash
while true ; do for i in * ; do cp "$i" ~/slideshow.jpg ; echo $i ; sleep 5 ; done ; done
Как я могу рандомизировать этот процесс?
Я чувствую, что этот вопрос - домашнее задание. Позволь мне сделать это для тебя.
*
в этом скрипте скорее всего возвращается алфавитный список каталога. Таким образом, вы можете перехватить этот список и рандомизировать в этот момент.
Вы также можете загрузить содержимое каталога в массив, выбрать случайным образом число - изменить размер массива и, если результат будет пустым, двигаться вперед до тех пор, пока вы не нажмете непустую запись. Затем очистите эту запись по мере ее использования. Вам понадобится счетчик или что-то еще, чтобы потом отслеживать, сколько элементов вы использовали, чтобы вы знали, когда вы использовали все записи.
Кроме того, вы можете вместо этого загрузить записи во что-то вроде связанного списка и создать случайную запись # для использования, а затем отбросить из структуры данных.
Вероятно, есть много других вариантов. Но я только что дал вам наброски для 3 грубых подходов. Конечно, я не написал код для вас, но я сделал сложную часть. Пожалуйста ;)
Следующее должно 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
Конечно, вы можете удалить обратную косую черту и новые строки, если вам нравятся однострочные;)