Предполагая, что имена файлов не имеют пробелов, просто подставьте вывод List :: Util :: shuffle .
for i in `perl -MList::Util=shuffle -e'$,=$";print shuffle<*.txt>'`; do
....
done
Если в именах файлов есть пробелы, но нет встроенных символов новой строки или обратной косой черты, читайте строку за раз.
perl -MList::Util=shuffle -le'$,=$\;print shuffle<*.txt>' | while read i; do
....
done
Чтобы быть полностью безопасным в Bash, используйте NUL-концевые строки.
perl -MList::Util=shuffle -0 -le'$,=$\;print shuffle<*.txt>' |
while read -r -d '' i; do
....
done
Не очень эффективно, но при желании это можно сделать в чистом Bash. sort -R
делает что-то подобное внутри себя.
declare -a a # create an integer-indexed associative array
for i in *.txt; do
j=$RANDOM # find an unused slot
while [[ -n ${a[$j]} ]]; do
j=$RANDOM
done
a[$j]=$i # fill that slot
done
for i in "${a[@]}"; do # iterate in index order (which is random)
....
done
Или используйте традиционную тасовку Фишера-Йейтса.
a=(*.txt)
for ((i=${#a[*]}; i>1; i--)); do
j=$[RANDOM%i]
tmp=${a[$j]}
a[$j]=${a[$[i-1]]}
a[$[i-1]]=$tmp
done
for i in "${a[@]}"; do
....
done