求一个智能打包到 tar 的脚本

2022-01-04 04:12:08 +08:00
 xuegy
场景:NAS 里有已经毕业的人留下的数据要保留若干年,碎片文件过多想打包为 tar ( NAS 已开启 zstd 压缩,不用打包到 tgz ),求一个智能打包的脚本。

具体需求:
1.若当前目录没有大量碎片文件(此处的大量碎片文件指>100 个<1MB ),不用打包。
2.若当前目录有大量碎片文件,递归找到含有大量碎片文件的子目录并打包,其余大文件不用动。

看起来有点绕,原则就是把碎片文件打包提高效率,同时大文件无需多此一举。
3039 次点击
所在节点    Linux
21 条回复
beginor
2022-01-04 09:13:36 +08:00
需求明确了, 接下来楼主打算悬赏多少银子?
2i2Re2PLMaDnghL
2022-01-04 09:23:10 +08:00
『已经毕业的人留下的数据要保留若干年』,存档直接打一个大包就结了。

我觉得你要写个这样的『智能』打包,比直接把大文件一并打包更『多此一举』
liuxu
2022-01-04 09:48:03 +08:00
@beginor 回帖消耗 5 铜币,被楼主点赞获得 10 铜币,利润 5 铜币

楼主用 python 写脚本吧
bfdh
2022-01-04 10:08:21 +08:00
若当前目录有 100 个子目录,每个子目录下有一个小于 1M 的文件和一个大于 1M 的文件,要怎么处理?
2338022
2022-01-04 10:10:12 +08:00
find
xuegy
2022-01-04 10:25:52 +08:00
@2i2Re2PLMaDnghL 我已经这么干了,这样的结局就是最大的一个包 600GB
xuegy
2022-01-04 10:28:02 +08:00
@bfdh 虽然我们的 NAS 里没看到这种情况,但是你提出的这种情况确实很棘手...
killva4624
2022-01-04 10:50:19 +08:00
需求的 1 和 2 两点结合起来有一个疑问。
比如根目录是 A ,有如下子目录 A1 ~ A10 ,其中 A1 碎片文件 60 个,A2 碎片文件 50 个,A3 碎片文件 10 个,但 A3 有大文件 100 个。
那么只打包这 120 个碎片文件,而不是需求 2 所说的"递归找到含有大量碎片文件的子目录并打包"?
2i2Re2PLMaDnghL
2022-01-04 11:16:21 +08:00
@xuegy 打成能切片的包吧;当然 tar 也可以简单地分隔切片

就算你『智能』处理,一个目录下六十万个 1023KiB 的文件不也一样打出 600G 吗

(其实正确的措施是转移到冷存储,既然都能接受打包甚至打层叠 tar 包了,没随时可取的需求吧
XiLingHost
2022-01-04 11:23:01 +08:00
600G 也不算大吧,反正是冷数据,干脆搞个磁带机存
xuegy
2022-01-04 12:31:06 +08:00
@killva4624 我大概看了一下,这种情况不存在,我们的 NAS 里大部分目录的文件数都是<10 或者>500 ,
xuegy
2022-01-04 12:32:54 +08:00
@2i2Re2PLMaDnghL 并不完全是冷数据,也有偶尔要去调用已毕业学生数据的情况。
2i2Re2PLMaDnghL
2022-01-04 12:56:00 +08:00
@XiLingHost 喷了,磁带机少说两千以上了,比两块 1T 硬盘贵多了

@xuegy 需要调用的话不适合用 tar ,tar 只能顺序读取否则不能定界,你这上千个 <1M 的打一个包读取其中任何一个就得全部读一遍。你需要带索引可切片的打包类型。zip 和 7z 和 rar 都可以仅存储不压缩。

当然还原一下,我觉得你这个『碎片文件打包提高效率』也可能是多此一举,除了 NTFS 好像其他文件系统一次性写入之后仅读取都不会因为碎片化而降低效率的。
xuegy
2022-01-04 13:30:14 +08:00
@2i2Re2PLMaDnghL 我特意测试过,大量小文件用 rsync 传输只能跑到 12Mb/s ,远不如把大包复制到本地再解包快…
XiLingHost
2022-01-04 14:08:36 +08:00
@xuegy 试试打成 iso/vhdx/vdi/vmdk
XiLingHost
2022-01-04 14:10:37 +08:00
@2i2Re2PLMaDnghL 我觉得“最大的一个包 600G”这种情况怎么也不止两块 1T 硬盘了吧......假如常见的包是最大的包的体积的一半,也就是 300G ,那 2T 的硬盘也放不下几个包了
2i2Re2PLMaDnghL
2022-01-04 14:44:11 +08:00
@XiLingHost (淦,我绕晕了
rrfeng
2022-01-04 14:45:36 +08:00
几行脚本的事儿……楼主可以自己搞定的
yzding
2022-01-04 15:27:29 +08:00
`find . -type f -size 1M -print | wc -l`
`find . -type f -size 1M -print | xargs tar -cvf test.tar`
tflins
2022-01-04 16:22:03 +08:00
还有什么要求吗,没有我就开始写了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/825983

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX