Linux-tar打包解包命令

tar打包解包命令

[TOC]

常用选项

  • -c 创建 tar 文件

常用命令

1
2
3
4
5
6
# 压缩:
tar -cjv -f filename.tar.bz2 要被压缩的文件或目录名称
# 列出内容:-t 命令等同于 --list
tar -tjv -f filename.tar.bz2
# 解压缩:
tar -xjv -f filename.tar.bz2 -C 欲解压缩的目录

测试 *.tar 文件完整性

1
2
3
tar -tf /root/archive.tar
# 测试bz2格式的归档文件完整性
tar -jtv -f filename.tar.bz2

解包文件

  • tar解压到指定文件夹
1
tar -xvf com.jianshu.Hugo.tar -C ./com.jianshu.Hugo

打包文件

1
2
3
tar -cvf log.tar log2012.log    # 仅打包,不压缩!
tar -czvf log.tar.gz log2012.log # 打包后,以 gzip 压缩
tar -cjvf log.tar.bz2 log2012.log # 打包后,以 bzip2 压缩
  • 打包后不保存全路径
    -C后面跟需要打包的路径,意为指定tar工作的目录,最后的.表示打包当前目录。
    -C /var/www/site1 .意为,先把工作目录切换到/var/www/site1,再执行打包.目录的操作。
1
2
3
4
5
tar -cjf site1.tar.bz2 -C /var/www/site1 .
# 例如打包 Xcode 的 iOS SDK
tar -czvf iPhoneOS.sdk.tar.gz -C /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk .
# 上面一条命令也可以改为
tar -czvf iPhoneOS.sdk.tar.gz -C /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/ iPhoneOS.sdk
  • 打包 Hexo 博客文件夹并且排除node_modules文件夹
    因为此处命令中有一个-f选项,这个选项要求后面必须跟着一个文件路径,所以这里--exclude参数被放在了最前面
    -f选项的参数为XXX.github.io.tar.gz
    --exclude选项的参数为node_modules
    最后的XXX.github.io为位置参数
    zcv选项仅仅是个开关,没有参数。
1
2
3
4
tar --exclude node_modules -zcvf XXX.github.io.tar.gz XXX.github.io
# 单独剥离出 -f 选项
tar -czv --exclude node_modules -f XXX.github.io.tar.gz XXX.github.io
tar -czv --exclude='node_modules' -f XXX.github.io.tar.gz XXX.github.io

*.tar.xz文件

xz 是单独的一种压缩格式,对应的压缩命令是xz
这里给出的命令是一步到位操作 *.tar.xz 文件的方式。

解压

1
tar -xJf *.tar.xz

压缩

1
tar -cJvf archive.tar.xz ./filesToBeArchived

tar 工具的目录匹配规则

如果我们只想用tar打包某些目录或者排除打包某些目录的时候,需要给tar--exclude传入路径参数。那么,这些路径参数到底是怎么与目录和文件路径进行匹配的呢?
我们想排除foo.txt到底是排除了根目录的foo.txt文件还是排除了所有名为foo.txt的文件呢?

根据测试,tar路径匹配规则如下:
每次用tar打包压缩的时候,tar命令都会输出实际添加到压缩包的文件路径,这个路径的显示和具体的打包参数有关。
例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tar -cvf a.tar  -C /Users/rootuser/Desktop/未命名文件夹 .
# 显示的路径为
a .
a ./com.mcafee.ssm.ScanFactory.plist
a ./com.mcafee.virusscan.fmpd.plist
a ./a
a ./未命名文件夹
a ./com.mcafee.agent.macompat.plist
a ./com.mcafee.ssm.Eupdate.plist
a ./com.mcafee.agent.ma.plist
a ./b
a ./com.mcafee.ssm.ScanManager.plist
a ./com.mcafee.agent.macmn.plist
a ./b/a
a ./b/a.txt.bak
a ./b/b.txt
a ./a/a.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
tar -cvf a.tar  -C /Users/rootuser/Desktop/ 未命名文件夹
# 显示路径为
a 未命名文件夹
a 未命名文件夹/com.mcafee.ssm.ScanFactory.plist
a 未命名文件夹/com.mcafee.virusscan.fmpd.plist
a 未命名文件夹/a
a 未命名文件夹/未命名文件夹
a 未命名文件夹/com.mcafee.agent.macompat.plist
a 未命名文件夹/com.mcafee.ssm.Eupdate.plist
a 未命名文件夹/com.mcafee.agent.ma.plist
a 未命名文件夹/b
a 未命名文件夹/com.mcafee.ssm.ScanManager.plist
a 未命名文件夹/com.mcafee.agent.macmn.plist
a 未命名文件夹/b/a
a 未命名文件夹/b/a.txt.bak
a 未命名文件夹/b/b.txt
a 未命名文件夹/a/a.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
tar -cvf a.tar /Users/rootuser/Desktop/未命名文件夹
# 显示的路径为
tar: Removing leading '/' from member names
a Users/rootuser/Desktop/未命名文件夹
a Users/rootuser/Desktop/未命名文件夹/com.mcafee.ssm.ScanFactory.plist
a Users/rootuser/Desktop/未命名文件夹/com.mcafee.virusscan.fmpd.plist
a Users/rootuser/Desktop/未命名文件夹/a
a Users/rootuser/Desktop/未命名文件夹/未命名文件夹
a Users/rootuser/Desktop/未命名文件夹/com.mcafee.agent.macompat.plist
a Users/rootuser/Desktop/未命名文件夹/com.mcafee.ssm.Eupdate.plist
a Users/rootuser/Desktop/未命名文件夹/com.mcafee.agent.ma.plist
a Users/rootuser/Desktop/未命名文件夹/b
a Users/rootuser/Desktop/未命名文件夹/com.mcafee.ssm.ScanManager.plist
a Users/rootuser/Desktop/未命名文件夹/com.mcafee.agent.macmn.plist
a Users/rootuser/Desktop/未命名文件夹/b/a
a Users/rootuser/Desktop/未命名文件夹/b/a.txt.bak
a Users/rootuser/Desktop/未命名文件夹/b/b.txt
a Users/rootuser/Desktop/未命名文件夹/a/a.txt

总结:-C选项是切换tar的工作目录。tar先将工作目录切换到-C所指定的目录中。然后根据后续的压缩路径参数来压缩。

--exclude "path"匹配的就是这里的路径(和rsync是有点区别的,rsync的路径匹配和具体的工作命令有关系)

可以看到,tar命令的最后一个位置参数为tar打包后文件的入口点,如:

1
2
3
tar -cvf a.tar /Users/rootuser/Desktop/未命名文件夹 # 入口点为`Users/rootuser/Desktop/未命名文件夹`
tar -cvf a.tar -C /Users/rootuser/Desktop/ 未命名文件夹 # 入口点为`未命名文件夹`
tar -cvf a.tar -C /Users/rootuser/Desktop/未命名文件夹 . # 入口点为`.`

通配符:*可以匹配0个1个或者多个字符。

  • --exclude 'filename' 可以排除所有名为 filename 的文件和目录,无论它的路径是什么。

更多示例

  • 打包解包 gzip 压缩的 tar 文件
1
2
# 打包解包 gzip 压缩的 tar 文件
tar -czvf log.tar.gz log2012.log # 打包后,以 gzip 压缩
  • 打包 com.tencent.mobileqq 目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# tar.gz 压缩
tar\
--exclude "com.tencent.mobileqq/app_theme_810"\
--exclude "com.tencent.mobileqq/files/QWallet"\
--exclude "com.tencent.mobileqq/files/live_log"\
--exclude "com.tencent.mobileqq/txlib"\
--exclude "com.tencent.mobileqq/files/TencentVideoKit"\
--exclude "com.tencent.mobileqq/lib"\
--exclude "com.tencent.mobileqq/app_tombs"\
--exclude "com.tencent.mobileqq/app_lib"\
--exclude "com.tencent.mobileqq/app_installed_plugin"\
--exclude "com.tencent.mobileqq/app_.profilecard"\
-czvf /storage/emulated/0/########/com.tencent.mobileqq_"`date +%Y-%m-%d_%H-%M-%S`".tar.gz\
-C /data/data/io.va.exposed/virtual/data/user/0/ com.tencent.mobileqq

# tar.bz2 压缩
tar\
--exclude "com.tencent.mobileqq/app_theme_810"\
--exclude "com.tencent.mobileqq/files/QWallet"\
--exclude "com.tencent.mobileqq/files/live_log"\
--exclude "com.tencent.mobileqq/txlib"\
--exclude "com.tencent.mobileqq/files/TencentVideoKit"\
--exclude "com.tencent.mobileqq/lib"\
--exclude "com.tencent.mobileqq/app_tombs"\
--exclude "com.tencent.mobileqq/app_lib"\
--exclude "com.tencent.mobileqq/app_installed_plugin"\
--exclude "com.tencent.mobileqq/app_.profilecard"\
-cjvf /storage/emulated/0/########/com.tencent.mobileqq_"`date +%Y-%m-%d_%H-%M-%S`".tar.bz2\
-C /data/data/io.va.exposed/virtual/data/user/0/ com.tencent.mobileqq

Linux-tar打包解包命令
https://dnacore.github.io/post/c1f5a788-8df4-4698-98ee-f86441edb957.html
作者
DNACore
发布于
2018年10月31日
更新于
2023年11月13日
许可协议