linux环境中多个文件夹下文件数量较大,有的文件夹下文件数量达到200万个,各种操作不便,需检索整个目录耗时较长,需按文件的修改时间在该文件夹下创建新的文件夹,然后把该文件mv过去,直接上代码
#!/bin/bash
umask22
transferDirs="/home/sully/move_test,/tmp"
#transfer day
dayCount=3
#控制日期
expirationDate=`date -d "3 days" +%s`
array=({transferDirs//,/ })
for transferDir in ${array[@]}
do
#touch transfer log
transferLog=${transferDir}/transfer_to_dir_success.log
if [ ! -f "${transferLog}}" ]
then
touch ${transferLog}
chmod 777 ${transferLog}
fi
cd ${transferDir}
#当前时间
startTime=`date +'%Y-%m-%d %H:%M:%S'`
#打印开始时间
echo "${startTime} start transfer Dir:${transferDir}" >>${transferLog}
startSeconds=$(date --date="${startTime}" +%s);
#查询需处理的文件
transferFiles=`find ${transferDir} -maxdepth 1 -type f ! -name "*.log" -mtime +${dayCount}`
#逐个文件处理
for transferFile in ${transferFiles}
do
modifyDate=`stat "${transferFile}"|awk '$1=="Modify:"{print $2}'|awk -F "-" '{print $1""$2""$3}'`
echo ${transferFile}
#get modifyTime second
modifyDate1=`ls --full-time "${transferFile}"|awk '{print $6}'`
modifyTime=`ls --full-time "${transferFile}"|awk '{print $7}'|awk -F "." '{print $1}'`
modifyDateSecond=`date -d "${modifyDate1} ${modifyTime}" +%s`
#check modify time
if [ ${modifyDateSecond} -gt ${expirationDate} ]
then
echo "${modifyDateSecond} 大于 ${expirationDate}"
continue
fi
#mkdir
toDir=${transferDir}/${modifyDate}/
if [ ! -d "${toDir}" ]
then
mkdir -p ${toDir}
chmod 755 ${toDir}
fi
#copy file
mv ${transferFile} ${transferDir}/${modifyDate}/
echo "move ${transferFile} success" >> ${transferLog}
done
endTime=`date +'%Y-%m-%d %H:%M:%S'`
endSeconds=$(date --date="${endTime}" +%s);
echo "目录${transferDir}迁移到修改时间的文件夹,其运行时间:" $((endSeconds-startSeconds))"s">>${transferLog}
done
脚本的操作说明:
1.transferDirs里包含多个目录,用逗号隔开,新增处理目录比较方便;用逗号split,然后对单个目录处理
2.该脚本只处理三天前的文件,dayCount可随意配置
3.在查找transferFiles时,只搜索下一级目录,且过滤掉log文件,三天前的文件
4.通过stat,ls --full-time命令查看文件的修改时间
5.同时记录了迁移成功的文件和运行时间
脚本涉及知识点说明
字符串分割
shell 使用指定的分割符来分割字符串
#!/bin/bash
string="20181205,shell,split,test"
array=(${string//,/ })
for var in ${array[@]}
do
echo $var
done
find排除某类文件及往下一级目录
find /home/sully/test -maxdepth 1 -type f ! -name "*.log"
-maxdepth 往下几级查找
-type f 查找类型为文件
! -name "*.log"排除log文件