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

[ Linux ] tar 打包解包都需要两倍空间,有什么办法可以解决吗

  •  
  •   mianhk · 2020-07-14 21:48:22 +08:00 · 4853 次点击
    这是一个创建于 1600 天前的主题,其中的信息可能已经有所发展或是发生改变。

    文件比较小的时候还比较好处理,但是文件大了,磁盘空间可能就不够了。

    就解 tar 包而言,目前看到的比较流行的办法是:

    1.找到 tar 中的一个个文件,解一个删一个。优点是在文件夹大小差不多时候,占用空间会小很多。缺点是,极慢
    2.远程解包,然后 rsync 到目标机器。问题是还得专门搞一台机器。。

    20 条回复    2020-07-16 15:45:17 +08:00
    Osk
        1
    Osk  
       2020-07-14 22:01:21 +08:00 via Android
    换 7z ?
    Jirajine
        2
    Jirajine  
       2020-07-14 22:03:29 +08:00 via Android
    管道
    cev2
        3
    cev2  
       2020-07-14 22:17:20 +08:00
    1.打包+压缩不需要两倍空间;
    2.tar 可直接挂载,不需要解包。
    dangyuluo
        4
    dangyuluo  
       2020-07-14 22:28:26 +08:00
    pipe
    codehz
        5
    codehz  
       2020-07-14 22:43:50 +08:00
    https://unix.stackexchange.com/questions/341458/decompress-gzip-file-in-place
    按这个方法解压应该可以(改 unzip 为 tar xvf 附带压缩参数)
    压缩大概也可以,但是不确定能不能用 shell 实现
    laminux29
        6
    laminux29  
       2020-07-14 23:18:57 +08:00   ❤️ 1
    这根本就不是技术问题,建议楼主学一点服务器管理以及运维知识。

    你这个问题类似于,在公共场所大小便怎样才能不被打。

    答案并不是找出不被打的办法,而是根本就不能在公共场所大小便。

    还有个类似问题,tcp 怎样才能不粘包。
    laqow
        7
    laqow  
       2020-07-15 00:51:49 +08:00 via Android
    @laminux29 也有几十个 gz 打包成一个 tar 加起来几十 G 的场合吧
    lozzow
        8
    lozzow  
       2020-07-15 00:55:21 +08:00 via iPhone   ❤️ 6
    @laminux29 没必要这样吧,我还是相信很多朋友都不知道这个情况吧,大家不一定有朋友你这样的高度,我反正还是挺期待有朋友能回答一下楼主的问题,然后学习一下🤓
    shakoon
        9
    shakoon  
       2020-07-15 08:30:01 +08:00
    楼主可能还没有搞明白,tar 是没有压缩的,只是物理上把文件放到一起,和 zip/rar/7z/gz 之类的完全是两回事,所以才会用到你说的“两倍”空间
    amrom
        10
    amrom  
       2020-07-15 09:03:10 +08:00
    我可以想到的方法,先创建一个 tar,包再往里面添加,添加一个删除一个,管道符配合使用,添加一个删除一个
    amrom
        11
    amrom  
       2020-07-15 09:40:11 +08:00
    ```shell
    tar -cvf tmp.tar b.txt
    for file in `find 2020`
    do
    echo $file
    tar -uvf tmp.tar $file
    rm -rf $file
    done
    ```

    ## 1. 创建 tmp.tar 文件
    ## 2. 遍历需要打包的文件,追加到 tar 包内
    ## 3. 删除已经追加的
    lolizeppelin
        12
    lolizeppelin  
       2020-07-15 09:46:33 +08:00
    可以看下 coreutils 里 split 的的代码
    如果也是复制, 那应该没有一般性的做法能做到
    mianhk
        13
    mianhk  
    OP
       2020-07-15 09:52:05 +08:00
    @Osk #1 已经用了没办法改了
    @Jirajine #2 单纯只是解 tar 包的话,解完前后,原 tar 包和解开的文件都在,肯定还是两倍空间了。。
    @cev2 #3 1.只打包和解包的话是会的,原文件和新文件夹 加在一起。2.直接挂载想写文件进 tar 包可以直接操作吗,是不是也慢一些
    @codehz #5 粗略看了一下,这个回答好像本身就不建议用。。

    @laminux29 #6 现在问题是,我有个朋友已经公共场合大小便了,可以怎么处理让他不被打吗
    @shakoon #9 就是知道了这一点,所以才想要有没有什么好的办法,最前面说到的两个是可以保证一倍空间的,但是都还是有劣势
    @linjinbao66 #10 同第一种方式,这个过程耗时太长了
    Latin
        14
    Latin  
       2020-07-15 10:48:31 +08:00
    tar -czvf
    -z 添加 gzip 压缩
    Jirajine
        15
    Jirajine  
       2020-07-15 10:50:49 +08:00 via Android   ❤️ 1
    @mianhk 比如你的 tarball 是从网络下载,
    wget -O - xxx.tar.gz | tar xz -f -
    就可以只占用一份空间了。
    mianhk
        16
    mianhk  
    OP
       2020-07-15 13:49:20 +08:00
    @Jirajine #15 不是网络下载的。。
    @lolizeppelin #12 可能只有开始说的第二种算是比较好的了
    ETiV
        17
    ETiV  
       2020-07-15 14:33:59 +08:00
    「磁盘空间可能就不够了」
    不能加吗,或者 NFS 挂载一个远程的磁盘

    https://en.wikipedia.org/wiki/Tar_(computing)

    tar ... The name is derived from "tape archive", as it was originally developed to write data to sequential I/O devices with no file system of their own.
    iamwho
        18
    iamwho  
       2020-07-15 14:56:31 +08:00
    这和 linux 有什么关系?
    byzf
        19
    byzf  
       2020-07-16 13:58:36 +08:00
    我有个 100G 的文件夹, 拷贝了一份, 是不是必须占用 200G 硬盘?

    答: 压缩

    我不想用压缩

    答: 那你在问啥
    chzhx
        20
    chzhx  
       2020-07-16 15:45:17 +08:00
    记得当时 aix 下的 tar 没有-z 参数,我是用管道打包和解压的。
    tar -cvf - xxxx | gzip >xxxx.tar.gz
    gzip -cd xxxx.tar.gz | tar -xvf -
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2577 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 03:30 · PVG 11:30 · LAX 19:30 · JFK 22:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.