V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
xuegy
V2EX  ›  Linux

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

  •  
  •   xuegy · 2022-01-04 04:12:08 +08:00 · 3039 次点击
    这是一个创建于 1089 天前的主题,其中的信息可能已经有所发展或是发生改变。
    场景:NAS 里有已经毕业的人留下的数据要保留若干年,碎片文件过多想打包为 tar ( NAS 已开启 zstd 压缩,不用打包到 tgz ),求一个智能打包的脚本。

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

    看起来有点绕,原则就是把碎片文件打包提高效率,同时大文件无需多此一举。
    第 1 条附言  ·  2022-01-04 12:39:03 +08:00
    都是研究数据的备份,没有那么多复杂的情况。所有目录只有两种可能:1.有几个>10GB 的大文件。2.有上千个<1MB 的小文件。
    21 条回复    2022-01-04 21:16:03 +08:00
    beginor
        1
    beginor  
       2022-01-04 09:13:36 +08:00   ❤️ 2
    需求明确了, 接下来楼主打算悬赏多少银子?
    2i2Re2PLMaDnghL
        2
    2i2Re2PLMaDnghL  
       2022-01-04 09:23:10 +08:00
    『已经毕业的人留下的数据要保留若干年』,存档直接打一个大包就结了。

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

    楼主用 python 写脚本吧
    bfdh
        4
    bfdh  
       2022-01-04 10:08:21 +08:00
    若当前目录有 100 个子目录,每个子目录下有一个小于 1M 的文件和一个大于 1M 的文件,要怎么处理?
    2338022
        5
    2338022  
       2022-01-04 10:10:12 +08:00
    find
    xuegy
        6
    xuegy  
    OP
       2022-01-04 10:25:52 +08:00
    @2i2Re2PLMaDnghL 我已经这么干了,这样的结局就是最大的一个包 600GB
    xuegy
        7
    xuegy  
    OP
       2022-01-04 10:28:02 +08:00
    @bfdh 虽然我们的 NAS 里没看到这种情况,但是你提出的这种情况确实很棘手...
    killva4624
        8
    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
        9
    2i2Re2PLMaDnghL  
       2022-01-04 11:16:21 +08:00
    @xuegy 打成能切片的包吧;当然 tar 也可以简单地分隔切片

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

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

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

    当然还原一下,我觉得你这个『碎片文件打包提高效率』也可能是多此一举,除了 NTFS 好像其他文件系统一次性写入之后仅读取都不会因为碎片化而降低效率的。
    xuegy
        14
    xuegy  
    OP
       2022-01-04 13:30:14 +08:00 via iPhone
    @2i2Re2PLMaDnghL 我特意测试过,大量小文件用 rsync 传输只能跑到 12Mb/s ,远不如把大包复制到本地再解包快…
    XiLingHost
        15
    XiLingHost  
       2022-01-04 14:08:36 +08:00
    @xuegy 试试打成 iso/vhdx/vdi/vmdk
    XiLingHost
        16
    XiLingHost  
       2022-01-04 14:10:37 +08:00
    @2i2Re2PLMaDnghL 我觉得“最大的一个包 600G”这种情况怎么也不止两块 1T 硬盘了吧......假如常见的包是最大的包的体积的一半,也就是 300G ,那 2T 的硬盘也放不下几个包了
    2i2Re2PLMaDnghL
        17
    2i2Re2PLMaDnghL  
       2022-01-04 14:44:11 +08:00
    @XiLingHost (淦,我绕晕了
    rrfeng
        18
    rrfeng  
       2022-01-04 14:45:36 +08:00
    几行脚本的事儿……楼主可以自己搞定的
    yzding
        19
    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
        20
    tflins  
       2022-01-04 16:22:03 +08:00
    还有什么要求吗,没有我就开始写了
    xuegy
        21
    xuegy  
    OP
       2022-01-04 21:16:03 +08:00 via iPhone
    @XiLingHost 8 块 4T ,也考虑过磁带机的事情,磁带确实比硬盘便宜,但是磁带机初始成本太高了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   983 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:58 · PVG 06:58 · LAX 14:58 · JFK 17:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.