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