shell 脚本实现文件的随机无重复筛选

在做深度学习实验时,需要训练和测试较多类型的数据,以此来体现网络架构的合理性。不同的数据集数量不一,且列别繁多,在做图像分类实验时,如果人工的去筛选和划分图片,工作量巨大,还容易犯错。作为一名合格的程序员,不会偷懒是万万不行的!

废话不多说,直接上代码:

#!/bin/bash

trainPath="此处写训练集的路径"
validationPath="此处写测试集的路径"
# trainPath下的所有文件夹
trainDirList=`ls $trainPath`

# 遍历存有训练集的文件夹
for DirName in $trainDirList
do
    cd $trainPath/$DirName
    # 当前类别文件夹下图片总数
    dirNum=`ls -l|grep "^-"|wc -l`
    picList=`ls *.jpg`
    k=0
    for fileName in $picList
    do
        fileNameArr[k]=$fileName
        k=$k+1
    done

    arr=($(seq 1 $dirNum))
    num=${#arr[*]}
    # 需要转移到另外对应文件夹下的图片总数
    let filterNum=$num*1/4
    # 先随机生成一个指定范围的数字作为初始值
    res=${arr[$(($RANDOM%num))]}
    fileArr[1]=$res
    let i=2
    # 将所有生成的随机数保存进fileArr数组,作为要转移的图片的下标
    while(( i<=filterNum ));
    do
        res=${arr[$(($RANDOM%num))]}
        fileArr[i]=$res
        for((j=1;j<i;j++));
        do
        numJ=${fileArr[j]}
        if [[ $res == $numJ ]]; then
            unset fileArr[i]
            i=$i-1
            break
        fi
        done
        i=$i+1
    done

    cd $validationPath
    mkdir $DirName
    for((indexNum=0;indexNum<$filterNum;indexNum++))
    do
#       echo ${fileNameArr[fileArr[indexNum]-1]}
        mv $trainPath/$DirName/${fileNameArr[fileArr[indexNum]-1]} $validationPath/$DirName
    done
done

对上述代码作简要说明:首先把所有数据都放入训练集文件夹下,然后抽取四分之一的图片到测试集文件夹去,注意,中间的一大段代码实际上是为了自动生成无重复的随机数。

代码几秒钟就可以跑完,打开文件管理器查看,已经筛选完毕,省时省力,还能温习一下 shell 编程方面的知识,何乐而不为?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值