随机化arg命令以获取bash for语句

前端之家收集整理的这篇文章主要介绍了随机化arg命令以获取bash for语句前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个bash脚本,使用循环来处理目录中的所有文件

我在* .txt

OPS …..
DONE

有数千个文件,由于’* .txt’扩展,它们总是以字母数字顺序处理.

是否有一种简单的方法可以随机输入订单并确保我只处理所有文件一次?

假设文件名没有空格,只需替换 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

或者使用传统的Fisher-Yates shuffle.

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

猜你在找的Bash相关文章