随机化arg命令以获取bash for语句
发布时间:2020-12-15 18:58:04 所属栏目:安全 来源:网络整理
导读:我有一个bash脚本,使用循环来处理目录中的所有文件 我在* .txt 做 OPS ….. DONE 有数千个文件,由于’* .txt’扩展,它们总是以字母数字顺序处理. 是否有一种简单的方法可以随机输入订单并确保我只处理所有文件一次? 假设文件名没有空格,只需替换 List::Util
我有一个bash脚本,使用循环来处理目录中的所有文件
我在* .txt 有数千个文件,由于’* .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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |