V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ggp1ot2
V2EX  ›  程序员

Linux 下用 tar 和 zip 压缩文件夹有啥区别

  •  
  •   ggp1ot2 · 2023-01-19 12:06:40 +08:00 · 8635 次点击
    这是一个创建于 674 天前的主题,其中的信息可能已经有所发展或是发生改变。

    需要定时备份一个文件夹,大概 300m ,该文件夹下有多个子文件夹和各种文件。

    采用的思路是压缩该文件夹上传到其他地址。

    搜了下压缩文件夹的命令,发现大多数教程都推荐的 tar 命令,但是我发现 zip 命令更简单好用啊。

    就压缩的结果来看,tar.gz 和.zip 有区别吗?

    为什么我会有一种用 tar 命令更高级的感觉?

    50 条回复    2023-01-23 19:31:16 +08:00
    EngAPI
        1
    EngAPI  
       2023-01-19 12:08:48 +08:00   ❤️ 1
    zip 有时候编码会有问题
    xtreme1
        2
    xtreme1  
       2023-01-19 12:09:18 +08:00   ❤️ 7
    tar 能保留 unix 文件属性(uid/gid/权限)
    ggp1ot2
        3
    ggp1ot2  
    OP
       2023-01-19 12:10:59 +08:00
    因为很多软件包和库都是用的 tar ,但是 tar 貌似没有压缩,只是打包,文件大小比 zip 要大,为啥都要用 tar 呢? zip 又能压缩文件,生成的压缩包还更小,不应该是更好吗?
    thinkershare
        4
    thinkershare  
       2023-01-19 12:12:24 +08:00
    看是否需要保留文件在文件系统上那堆附加标记,如果纯粹只需要保存文件内容和文件夹结构,选择一个压缩率搞得的就行,我长期需要在 Win/Mac/Linux 交换文件,zip 文件在资源管理器可以不解压查看,所以 ZIP 还是用的最多。
    thinkershare
        5
    thinkershare  
       2023-01-19 12:12:58 +08:00
    @ggp1ot2 tar 和 gz 是可以混合在一起的嘛,完成打包和压缩工作。
    Xusually
        6
    Xusually  
       2023-01-19 12:13:03 +08:00 via iPhone   ❤️ 10
    tar 只是一个归档工具 gz 使用 gnuzip 给 tar 归档加上了压缩
    gz 是 zip (默认 deflate )的 gnu 实现 gnuzip->gz
    所以 gnu/linux 默认用 gz 很正常
    lrigi
        7
    lrigi  
       2023-01-19 12:13:34 +08:00
    Tar 解压压缩命令完全记不住,还是 zip 好
    ggp1ot2
        8
    ggp1ot2  
    OP
       2023-01-19 12:16:34 +08:00
    @lrigi #7 是的,从我刚搜这个命令来看,zip 简单好记,但是我见到的大多数教程以及自己的经验,发现 tar 用的更多,所以有点疑问
    ggp1ot2
        9
    ggp1ot2  
    OP
       2023-01-19 12:16:57 +08:00
    @Xusually #6 谢谢,有点懂了
    libook
        10
    libook  
       2023-01-19 12:29:49 +08:00   ❤️ 14
    tar 是归档,zip 是压缩。
    归档就是不进行压缩,只是将多个文件目录打包到一个文件里。
    压缩通常会包括归档(但不一定是 tar 的方式),并在此基础上使用压缩算法来减小最终包文件的大小。

    一般不会只使用 tar ,而是在 tar 打包后再使用压缩算法进行压缩。tar 的指令工具原生支持 gzip 、bzip2 、compress 、lzip 、lzma 、lzop 、xz 。其实如果接受用两条指令的话,你可以先 tar 然后用任何压缩方式再压缩打包好的 tar 文件,比如 zip 和 7z 。

    现在大多使用 tar 是因为 tar 对 Linux/Unix 文件系统更友好,可以保留所有文件系统信息,而 zip 基本之针对 MSDOS 文件系统进行了支持。比如很多 Linux 开源软件的发行,都是需要打包很多文件,同时需要保留这些文件的权限标识,一些文件对所有用户可读、一些文件仅对 root 用户可读,还有一些文件需要可执行权限。当然,在你不需要保留文件系统信息的情况下,使用 zip 也没有问题。
    julyclyde
        11
    julyclyde  
       2023-01-19 12:33:35 +08:00
    tar 还有个问题就是:不带文件列表,而是用链表串起来的。随机访问会比较麻烦
    zip 在末尾有个文件列表
    ggp1ot2
        12
    ggp1ot2  
    OP
       2023-01-19 12:37:50 +08:00
    @libook #10 了解了,非常感谢 🙋
    hefish
        13
    hefish  
       2023-01-19 12:39:00 +08:00
    tar 只打包不压缩。
    zip 能压缩也能打包。
    nightwitch
        14
    nightwitch  
       2023-01-19 12:43:25 +08:00   ❤️ 12
    歪个楼:
    针对记不住 Linux 各种压缩格式的解压方式的,建议用这个脚本放 bashrc 里
    https://gist.github.com/crazyhottommy/4115e40a7ba328c771fea0f83992dc30

    @lrigi @ggp1ot2
    DeltaC
        15
    DeltaC  
       2023-01-19 13:19:57 +08:00   ❤️ 1
    拒绝 zip ,跨平台文件名乱码真要命
    Jirajine
        16
    Jirajine  
       2023-01-19 13:20:07 +08:00   ❤️ 2
    @lrigi 之前在某 linux 群里看到的一个记法:
    tar -xzf <压缩包> 参数缩写肖战粉
    创建就是把 x(extract) 换成 c(create),后面再跟目录。
    当然更方便的是直接用 unar 这样的简化工具或查 tldr 。
    makelove
        17
    makelove  
       2023-01-19 13:24:34 +08:00
    tar 怎么就不能压缩了,一堆的压缩参数,可以选不同的格式,有些比 zip 压缩性能好得多

    不过和 zip 不同的是 tar 是整体压缩,无法单独定位解开其中的一个文件。
    nuII
        18
    nuII  
       2023-01-19 13:43:23 +08:00
    `tar -cavf xxx.tar.xx xxx
    ddonano
        19
    ddonano  
       2023-01-19 13:54:45 +08:00
    @Jirajine 肖战粉,学到了
    limbo0
        20
    limbo0  
       2023-01-19 14:01:26 +08:00   ❤️ 3
    @lrigi #7
    - [c]reate a g[z]ipped archive and write it to a [f]ile:
    tar czf target.tar.gz file1 file2 file3
    - E[x]tract a (compressed) archive [f]ile into the current directory [v]erbosely:
    tar xvf source.tar[.gz|.bz2|.xz]

    英文比较好记点
    wonderfulcxm
        21
    wonderfulcxm  
       2023-01-19 14:17:49 +08:00 via iPhone
    正好我最近用这俩,zip 的参数可以直接加密码,tar 得借助第三方工具比如 openssl 。
    duke807
        22
    duke807  
       2023-01-19 14:26:20 +08:00 via Android   ❤️ 10
    嫌命令不好记的估计都是平时不用 linux 做主系统的,然后还看了一些垃圾中文教程

    linux 下解压任何 tar 压缩包,都是这样就行
    tar xf xxx.tar.bz2

    xf 不用写成 -xf ,更不用加更多字母

    压缩则是:
    tar caf xxx.tar.xz xxx/

    a 表示根据文件名,自动选择对应压缩算法
    shijingshijing
        23
    shijingshijing  
       2023-01-19 14:44:37 +08:00
    zip 岂止是文件名,对于路径特别深的,而且有一两个文件夹名字特别长或者有特殊字符的,几乎是灾难。可以试着压缩 /解压缩 npm 。。。
    bao3
        24
    bao3  
       2023-01-19 15:18:34 +08:00 via iPhone
    上面的回复太长了。一个简单的区别

    tar 是打包,不带压缩,就像你桌上的文件袋,只是装文件而不压缩文件。

    zip 是英文“拉链”的引申过来,它是压缩为主。比如你穿了衣服,不拉链,衣服敞开着,可能比较占地方,特别是冬天的衣服。但是如果你 zip 一下,拉上拉链,衣服就会更修身,占得空间就小。


    有人会说,tar 也可以产生 tar.gz 的压缩档啊,是的,但整个工作流程是先 tar ,然后 tar 通过 z 参数调用了 gzip ,对打包的 tar 档案进行 zip ,最终生成 tar.zip.

    这两者的区别是 zip 要消耗过多的资源,但 tar 因为不压缩,所以以看作是简单的复制粘贴过程。
    lrigi
        25
    lrigi  
       2023-01-19 15:31:32 +08:00 via iPhone
    @nightwitch 这个脚本有点牛,谢谢已经保存了。每次我都是一边吐槽“你为什么要用 tar.gz/tar 压缩这么麻烦”一边搜怎么解压缩。
    billlee
        26
    billlee  
       2023-01-19 15:47:42 +08:00 via Android
    哪个好用纯粹是习惯问题吧,我就觉得 zip 的命令参数总是记不住。不过现在 bsdtar 可以直接用 -xf 解压 zip, 方便多了
    lrigi
        27
    lrigi  
       2023-01-19 15:48:55 +08:00 via iPhone
    @Jirajine
    @limbo0
    看了各位的回复说实话我更迷惑了,比如肖战粉“xzf”是解压,第二个兄弟为什么又变成了“xvf”,我搜了下 v 是显示解压的全过程,但搜出来的结果告诉我应该用“xzvf”???
    是不是这样的:
    我理解 tar 因为没有压缩( z ),所以用 x(v)f ?
    然后 tar.gz 有压缩( z ),用 xz(v)f
    但第二个兄弟的回复“ tar xvf source.tar[.gz|.bz2|.xz]” 看起来 xvf 也能解压缩 tar.gz ?
    Seanfuck
        28
    Seanfuck  
       2023-01-19 15:54:06 +08:00
    tar -z 参数不就是压缩吗?
    duke807
        29
    duke807  
       2023-01-19 15:55:56 +08:00
    @lrigi #27 看我 #22 楼回复
    BrokenVns
        30
    BrokenVns  
       2023-01-19 16:19:02 +08:00
    补充下,zip 跨平台导致各个平台的 zip 工具在实现是有差别的,比如对软链接文件的支持和实现都是不同的。
    你用工具 A 压缩的软链接文件用工具 B 可能会解压失败。
    原因是 A 的实现方式是把链接地址作为内容存储在数据域,而 B 的的实现方式是把软链接地址存储在额外数据域里。
    limbo0
        31
    limbo0  
       2023-01-19 17:30:16 +08:00
    @lrigi #27
    man tar 手册里
    -z, --gunzip, --gzip
    (c mode only) Compress the resulting archive with gzip(1). In extract or list modes, this option is ignored. Note that this tar implementation recognizes gzip compression automatically when reading archives.

    -z 参数解压过程不用加, 程序会自动判断文件的格式进行处理

    压缩过程还是需要加上的, 可以试试如果不加就变成 POSIX tar archive 文件,其实就是归档成一个文件了,并没有压缩空间
    lc1450
        32
    lc1450  
       2023-01-19 17:30:19 +08:00
    @lrigi 并不是, 解压用 xf 就行. x 表示解压, 会根据文件名识别压缩算法, 所以 z 可以省略, f 接文件, 想看详细过程加参数 v
    之前不知道,每次都查, 后来才发现的, 网上的教程大多都是到处复制, 会有一些偏差
    Jirajine
        33
    Jirajine  
       2023-01-19 17:34:47 +08:00
    @lrigi 肖战粉只是个记法,记住之后看一下缩写,v(verbose) f(file) z(zip),哪些可加可不加和对应效果都很好理解。
    wgq2633
        34
    wgq2633  
       2023-01-19 18:12:22 +08:00 via Android   ❤️ 1
    @ggp1ot2 长期用的三组参数,
    -zxvf 解压 gz 压缩的 tar 包,-zcvf 创建,-ztvf 列出包内容

    其中的 z 参数 gz, 改用 j 是 bzip2, 改用 J 是 xz 格式,
    三种参数,三个变体,可以满足我的日常需求了
    Bingchunmoli
        35
    Bingchunmoli  
       2023-01-19 18:19:40 +08:00 via Android
    学到了,刚开始有文档看后来用多了就记住一个 xzvf 其他都百度查,主要还是 zip 基础操作简单喜欢 tar 参数多了还没中文汉化的 help
    webcape233
        36
    webcape233  
       2023-01-19 18:34:32 +08:00 via iPhone
    tar -cJvf xx.tar.xz your-dir
    tar -xJvf xx.tar.xz
    lambdaq
        37
    lambdaq  
       2023-01-19 20:56:00 +08:00
    我的意见是能 gz 就 gz 。。。。unzip 有些发行版默认没安装。。。。
    rocmax
        38
    rocmax  
       2023-01-19 21:13:09 +08:00 via Android
    zip 的文件信息存在尾部,无法使用流式处理
    adoal
        39
    adoal  
       2023-01-19 21:15:56 +08:00
    你对 Linux 的文件权限 ugo rwx 这一套有概念吗? zip 对这些东西支持不好,tar 可以完整保留。所以如果将来要原样恢复,还是 tar 了再压缩好。

    另外,tar+gz/bz2/xz 这种先打包再压缩的方式可以类比于 rar/7z 里的“固实压缩”,而 zip 是先压缩单个文件再打包,类似 rar/7z 的默认压缩。
    kenvix
        40
    kenvix  
       2023-01-19 21:18:55 +08:00
    tar 没有目录结构,zip 没有编码规范。建议 7z 。
    msg7086
        41
    msg7086  
       2023-01-19 21:25:23 +08:00
    解压缩不需要指定压缩类型,所以解压缩直接 xf 就行,不需要加 z 或者 J 之类的。
    压缩需要指定,但是也可以分两步操作,先 tar 打包,再手动调用 gzip 或者 xz 压缩。
    单步操作主要是比较省硬盘空间,但是参数选择比较少。
    jim9606
        42
    jim9606  
       2023-01-19 22:41:46 +08:00
    tar 对 POSIX 文件系统元数据支持较好,zip 容器理论上也可以通过扩展支持,但不同软件不一定正确实现了这些扩展。
    tar 只归档,gz 只压缩,gzip 是把 tar 作为一个整体进行压缩的(也就是固实),压缩率会好一些,坏处是没法原地修改和部分解压。zip 不支持固实。
    zip 也不支持符号链接、硬链接、稀疏文件。

    zip 的文件编码问题就是不同实现导致的。此中的吐血事可以看这个,支持了但没完全支持。

    https://blog.abysm.org/2016/04/pkzip-filename-mojibake/

    其实只要是有不同主流实现就有可能出现兼容性问题,linux 常用 infozip 但 windows 常用 7-zip 套壳。tar 的实现也有 GNU tar 和 bsdtar 两种,有时也会出点问题。
    jim9606
        43
    jim9606  
       2023-01-19 22:53:29 +08:00
    另外一点,不怎么喜欢用 zip/unzip 是因为这玩意一般不预装,但 tar 和 gzip/gunzip 一般都是预装的。
    冷知识,docker cp (曾经?)依赖容器内的 tar 才能工作,这点约等于要求所有 docker 镜像都得预装 tar 。
    至于选项开关 -c[reate] -e[xtract] -f[ile] 基本够用了,压缩方式让 tar 自己猜去。
    Tink
        44
    Tink  
       2023-01-20 01:06:53 +08:00
    tar 不能压缩吧? gzip 可以压缩
    wizardyhnr
        45
    wizardyhnr  
       2023-01-20 01:23:34 +08:00
    zip 可以指定 utf8 编码,用 7z -mcu=on 。不支持 solid compression 也不全是缺点,solid compression 一旦文件出现损坏,很难恢复。归档 solid compression 不一定是好的选择。
    用于不同平台的分享可以装个 7z ,用脚本定制输出格式,zip/7z ,solid compression/non solid compression ,编码格式,压缩参数
    unzip 有-O 的选项处理编码问题。
    一般各平台交互打包就用 zip uft8 ,这个兼容性是最好的。其他就用 7z 。Linux 备份用 tar 。
    leido
        46
    leido  
       2023-01-20 02:31:20 +08:00 via Android
    win 上面几乎没有归档不压缩的格式(虽然 zip 可以),所以新手不太容易理解 tar ,但它真的只打包

    压缩率(一般情况) xz > 7z > bz2 > zip(gz)
    另外还有和 zip 类似的 7z 命令,楼主可以研究
    ysc3839
        47
    ysc3839  
       2023-01-20 03:19:08 +08:00 via Android
    tar 全称是 tape archive ,即是给磁带设计的格式,而磁带的特点是顺序读写,因此 tar 是顺序处理的,因此可以实现边下载边解压 tar ,给 tar 添加文件可以直接添加到末尾,要列出 tar 中所有文件则需要处理完整个 tar ,尤其是 tar 配合其他压缩格式时,需要完整解压一遍才能知道内容。
    ysc3839
        48
    ysc3839  
       2023-01-20 03:22:43 +08:00 via Android
    @lrigi #27 不同的 tar 工具有不同的特性,比如 GNU tar 可以根据文件扩展名自动解压,就不需要加 z 指明压缩格式。v 代表 Verbose ,会输出文件名,个人一般是不加,因为有的时候会影响性能。
    lrigi
        49
    lrigi  
       2023-01-20 10:07:29 +08:00 via iPhone
    @duke807 试了下确实是可以的,感谢。
    @Jirajine
    @limbo0
    @lc1450
    @ysc3839
    完全理解了,上网搜真的搜的不太明白,感谢各位! tar 就像一个多功能工具刀,加上不同的参数就是不同功能,之前还疑惑为什么要加这么长的参数相比 zip -r 和 unzip
    ggp1ot2
        50
    ggp1ot2  
    OP
       2023-01-23 19:31:16 +08:00
    @lrigi #49 感谢帮忙一一艾特啦,确实,这些东西搜一些乱七八糟的博客讲解,不如 v 友说的明白!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1883 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 16:21 · PVG 00:21 · LAX 08:21 · JFK 11:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.