将 /data/invoice/1~n/{1..1000} 均衡分部数据到其他的 /datan 分区
假设有 /data/invoice/1/{1..1000} // 1 千个文件夹
另有分区目录/data1 /data2
那么脚本设计的数据存放为:
/data/invoice/1/{1..333} 实际存放数据在 /data/invoice/1/{1..333}
/data/invoice/1/{334..666} 实际存放数据在 /data1/invoice/1/{334..666}
/data/invoice/1/{667..999} 实际存放数据在 /data2/invoice/1/{667..999}
#!/bin/sh arr=() #创建目录 /data?/id/1..1000 function credir() { dir=$1 #/data* 目录 bappid=$2 #开始的appid eappid=$3 #结束的appid while [ $bappid -le $eappid ] do mkdir -p $dir/invoice/$bappid/ mkdir -p $dir/invoice/$bappid/{1..1000} bappid=$(( $bappid + 1 )) done } #拆分(打散目录) function dsplit() { bappid=$1 #开始的appid eappid=$2 #结束的appid dat_num=$3 #/data* 挂载点数 uin_num=1000 #appid 目录下的子目录数[1..999] lns_num=`expr $uin_num / $dat_num` #子目录的平均软链接数 echo ${arr[*]:1} while [ $bappid -le $eappid ] do buin=$lns_num for var in ${arr[*]:1} do k=1 while [ $k -le $lns_num ] do if [ $buin -lt $uin_num ]; then rm /data/invoice/$bappid/$buin -f -r ln -s $var/invoice/$bappid/$buin /data/invoice/$bappid/$buin buin=$(( $buin + 1 )) fi k=$(( $k + 1 )) done done bappid=$(( $bappid + 1 )) done } #获取所有的 /data? 挂载点 function StartInit() { f=0 mt=`df -h | awk '{print $6}'` for d in ${mt} do if [[ $d =~ "data" ]] then arr[$f]=$d f=$(( $f + 1 )) fi done } # 1. 参数检查 if [ "$#" != "2" ]; then echo "Usage: $0 begin_appid end_appid" echo "e.g. : $0 1 15" exit 1; fi # 2. 入口开始,获取所有的 /data* 挂载点,# 并且保存在 arr 数组内 StartInit #测试数据 #arr[1]=/data1 #arr[2]=/data2 #获取arr数组长度 len=${#arr[@]} #3. 开始在各个 /data* 下面创建目录结构 for var in ${arr[*]} do credir $var $1 $2 #参数1 分区目录,参数2 开始的appid,参数3 结束的appid done #4. 开启拆分处理 dsplit $1 $2 $len #参数1 开始的appid,参数2 结束的appid,参数3 /data* 分区的个数