linux操作系统上千万级文件归档压缩

本文介绍了如何在Linux操作系统上对千万级文件进行归档压缩。作者通过分析文件命名规则,制定了按日期归档的策略,先逐日移动文件到指定文件夹,再使用tar进行压缩。整个过程耗时约5天,对于有时间限制的情况,建议采用多线程和更小粒度的拆分方式。提供的bash脚本展示了文件迁移和压缩的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值