En supposant que les noms de fichiers n'ont pas des espaces, remplacez juste la sortie de List::Util::shuffle.
for i in `perl -MList::Util=shuffle -e'$,=$";print shuffle<*.txt>'`; do
....
done
Si les noms de fichiers contiennent des espaces mais n'ont pas de saut de ligne ou de barre oblique inverse, lisez une ligne à la fois.
perl -MList::Util=shuffle -le'$,=$\;print shuffle<*.txt>' | while read i; do
....
done
Pour être complètement sûrs chez Bash, utilisez des chaînes à terminaison NUL.
perl -MList::Util=shuffle -0 -le'$,=$\;print shuffle<*.txt>' |
while read -r -d '' i; do
....
done
Pas très efficace, mais il est possible de le faire dans Bash pur si on le souhaite. sort -R
fait quelque chose comme ça, en interne.
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
Ou utilisez un shuffle traditionnel Fisher-Yates.
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
pourquoi voulez-vous faire cela? – ennuikiller