将 /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* 分区的个数