现已知,公司内有一个目录,存放着上百万张居民×××照片,照片的命名以居民的×××号加后缀格式如(150422198207055113.jpg),由于数百万张照片全部存在同一个目录,且此目录会不断增长(因为前台用户每一次查询都会把查出来的居民照片存放在这个目录下),因此程序在调用此目录下一个文件时会变的非常慢(经查应该是目录下文件过多,导致系统在查询一个文件需要很长时间),因此决定将此目录下的文件按照一定的格式存放在不同的目录中,格式如下:
18位×××:
370 722 1978 1222 2517.jpg
省 市 生年 生日 其它
15位×××:
130 133 83 1013 213.jpg
省 市 生年 生日 其它
现要求管理员制作一个脚本,把当前目录下的文件按照以上格式分别创建目录并把照片(注意是copy走,不是移走)存放到相应的目录下,脚本执行完毕后的目录结构应该如下:
18位×××:
370/722/1978/1222/370722197812222517.jpg
15位×××:
130/133/83/1013/130133831013213.jpg
由于此目录下会不断产生新的文件,所以此脚本需每10分钟执行一次,一旦发现有新的文件产生就立即将其按相应的格式copy到相应目录中。
脚本如下:
#!/bin/bash
time=`date +%Y%m%d%H%M`
[ -d /tmp/dir15 ] || mkdir /tmp/dir15
[ -d /tmp/dir18 ] || mkdir /tmp/dir18
for time in `date +%Y%m%d%H%M -d "10 minutes ago" `
do
find /data/jpeg/*.jpg -type f -mmin -10 |awk -F'/' '{print $NF}'|grep '[0-9]\{15\}.jpg' > /tmp/dir15/$time
find /data/jpeg/*.jpg -type f -mmin -10 |awk -F'/' '{print $NF}'|grep '[0-9]\{18\}.jpg' > /tmp/dir18/$time
cat /tmp/dir15/$time | while read line15
do
dir1=`echo $line15 | cut -b1-3`
dir2=`echo $line15 | cut -b4-6`
dir3=`echo $line15 | cut -b7-8`
dir4=`echo $line15 | cut -b9-12`
mkdir /data/jpeg/${dir1}/${dir2}/${dir3}/${dir4} -p
cp /data/jpeg/${line15} /data/jpeg/${dir1}/${dir2}/${dir3}/${dir4}
done
cat /tmp/dir18/$time | while read line18
do
dir11=`echo $line18 | cut -b1-3`
dir22=`echo $line18 | cut -b4-6`
dir33=`echo $line18 | cut -b7-10`
dir44=`echo $line18 | cut -b11-14`
mkdir /data/jpeg/${dir11}/${dir22}/${dir33}/${dir44} -p
cp /data/jpeg/${line18} /data/jpeg/${dir11}/${dir22}/${dir33}/${dir44}
done
done
然后写计划任务,每10分钟执行一次。
转载于:https://blog.51cto.com/5iqiong/638630