linux操作系统上千万级文件归档压缩
近期公司生产服务器nas盘上存储的空间快满了,需要对一些旧数据进行归档并压缩成tar包,小编经过排查发现有几个文件夹下存储的文件都已经有15000000个左右了,经过分析发现这些文件都是跟外围系统交互数据以文件形式留存下来的数据报文。时间跨度从2000年-2022年,文件的命名也比较有规律是以8位日期+10为流水号组成的(例如:20221201000000001,20221201000000001...)。
确认完这些文件的个数和文件名规则后,开始着手准备归档的方案,由于文件名比较规律,小编准备按每天的数据文件备份成一个tar包例如(2022/20110101.tar)。小编在此以归档一个文件夹为例:
迁移前目标文件夹
/Users/kai/app/swift/incomtxt/20001205000000001
/Users/kai/app/swift/incomtxt/20001205000000002
/Users/kai/app/swift/incomtxt/20001205000000003
...(文件数约为15000000个)
迁移后
/Users/kai/app/swift/incomtxt_bak/2000/20001205.tar
/Users/kai/app/swift/incomtxt_bak/2000/20001206.tar
/Users/kai/app/swift/incomtxt_bak/2000/20001207.tar
由于本次迁移没有太多时间上的约束,所以小编在这里是按照串行的方式进行数据归档,服务的性能还行,大约用了5天左右的时间就完成归档。
如果大家有时间上的要求,建议可以将incomFile.txt按百万级或更小的维度进行拆分,然后使用多线程的方式进行归档,具体的速度还是得看服务器和磁盘的性能。
大家若有比较好的建议或方法,小编也希望大家在评论区里提出宝贵的意见,一起学习和探讨。
#!/bin/bash
sourcePath="/Users/kai/app/swift/incomtxt"
targetPath="/Users/kai/app/swift/incomtxt_bak"
filesName="/Users/kai/app/swift/incomFile.txt"
#获取目录下所有的文件名
function getFileName(){
cd $sourcePath
ls $sourcePath > $filesName
}
#创建备份文件存储的文件夹
function createWaitProcessFilePath(){
if [ ! -d $targetPath ]; then
mkdir -p $targetPath
fi
}
#开始迁移
function startMove(){
echo $(date +"%Y-%m-%d %H:%M:%S")" start move "
cnt=1
for line in `cat $filesName`
do
#创建归档文件夹
if [ ! -d $targetPath"/"${line:0:4}"/"${line:0:8} ]; then
echo $(date +"%Y-%m-%d %H:%M:%S") '创建' $targetPath"/"${line:0:4}"/"${line:0:8}
mkdir -p $targetPath"/"${line:0:4}"/"${line:0:8}
fi
echo $(date +"%Y-%m-%d %H:%M:%S") "正在处理第:"$cnt ":笔 " $line
#移动文件
mv $sourcePath"/"$line $targetPath"/"${line:0:4}"/"${line:0:8}
let "cnt++"
done
echo $(date +"%Y-%m-%d %H:%M:%S")" move over "
}
#文件压缩
function compressFile(){
echo $(date +"%Y-%m-%d %H:%M:%S")" start compressFile "
for year in `ls $targetPath`
do
cd $targetPath"/"$year
for day in `ls $targetPath"/"$year`
do
echo $(date +"%Y-%m-%d %H:%M:%S") "tar -zcvf "$day".tar" $day
tar -zcvf $day".tar" $day
#压缩完成后删除源文件
rm -rf $day
done
done
echo $(date +"%Y-%m-%d %H:%M:%S")" compressFile voer "
}
#执行方法
createWaitProcessFilePath
getFileName
startMove
compressFile
执行日志如下:
2022-12-23 10:53:47 start move
2022-12-23 10:53:47 创建 /Users/kai/app/swift/incomtxt_bak/2000/20001201
2022-12-23 10:53:47 正在处理第:1 :笔 20001201010000000001
2022-12-23 10:53:47 正在处理第:2 :笔 20001201010000000003
2022-12-23 10:53:47 正在处理第:3 :笔 20001201020000000001
2022-12-23 10:53:47 正在处理第:4 :笔 20001201020000000002
2022-12-23 10:53:47 正在处理第:5 :笔 20001201020000000003
2022-12-23 10:53:47 创建 /Users/kai/app/swift/incomtxt_bak/2000/20001202
2022-12-23 10:53:47 正在处理第:6 :笔 20001202010000000001
2022-12-23 10:53:47 创建 /Users/kai/app/swift/incomtxt_bak/2000/20001203
2022-12-23 10:53:47 正在处理第:7 :笔 20001203010000000001
2022-12-23 10:53:47 正在处理第:8 :笔 20001203010000000002
2022-12-23 10:53:47 创建 /Users/kai/app/swift/incomtxt_bak/2001/20011201
2022-12-23 10:53:47 正在处理第:9 :笔 20011201010000000001
2022-12-23 10:53:47 正在处理第:10 :笔 20011201010000000002
2022-12-23 10:53:47 创建 /Users/kai/app/swift/incomtxt_bak/2002/20021201
2022-12-23 10:53:47 正在处理第:11 :笔 20021201010000000002
2022-12-23 10:53:47 move over
2022-12-23 10:53:47 start compressFile
2022-12-23 10:53:47 tar -zcvf 20001201.tar 20001201
a 20001201
a 20001201/20001201020000000001
a 20001201/20001201010000000003
a 20001201/20001201020000000002
a 20001201/20001201020000000003
a 20001201/20001201010000000001
2022-12-23 10:53:47 tar -zcvf 20001202.tar 20001202
a 20001202
a 20001202/20001202010000000001
2022-12-23 10:53:47 tar -zcvf 20001203.tar 20001203
a 20001203
a 20001203/20001203010000000001
a 20001203/20001203010000000002
2022-12-23 10:53:47 tar -zcvf 20011201.tar 20011201
a 20011201
a 20011201/20011201010000000002
a 20011201/20011201010000000001
2022-12-23 10:53:47 tar -zcvf 20021201.tar 20021201
a 20021201
a 20021201/20021201010000000002
2022-12-23 10:53:47 compressFile voer