加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 18:58:04 所属栏目:安全 来源:网络整理
导读:我有一个bash脚本,使用循环来处理目录中的所有文件 我在* .txt 做 OPS ….. DONE 有数千个文件,由于’* .txt’扩展,它们总是以字母数字顺序处理. 是否有一种简单的方法可以随机输入订单并确保我只处理所有文件一次? 假设文件名没有空格,只需替换 List::Util
我有一个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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读