如何使用 tar - 命令示例
- 创建 tar 文件
在最简单的形式中,tar 命令可用于将多个文件复制到一个 .tar 文件中。 -c 选项用于创建新的存档文件,而 -f 选项用于指定要使用的存档文件(在本例中为 create)。
- 创建 tar 文件
[jack@onitroad ~]# tar -cf archive.tar test1.txt test2.txt [jack@onitroad ~]# ls -la -rw-r--r--. 1 root root 10240 Sep 2 12:26 archive.tar -rw-r--r--. 1 root root 52 Sep 2 12:24 test1.txt -rw-r--r--. 1 root root 18 Sep 2 09:42 test2.txt
添加到存档后,原始文件仍然存在,默认情况下不会删除它们。
请注意,我们不需要 .tar 扩展名,但是我们在这里使用它是为了让我们可以轻松查看文件是什么类型。
- 列出档案内容
我们可以使用 -t 选项列出 tar 文件中的内容。请注意,我们还需要 -f 选项来指定要运行的 tar 文件。
- 列出档案内容
[jack@onitroad ~]# tar -tf archive.tar test1.txt test2.txt
- 3.从tar文件中提取
我们可以使用 -x 选项提取 tar 文件的所有内容。在本例中,我们显示原始 test2.txt 文件的内容,将其清除,然后提取 archive.tar 的内容,确认 test2.txt 的内容已从存档中的副本返回。
[jack@onitroad ~]# cat test2.txt This is test2.txt [jack@onitroad ~]# > test2.txt [jack@onitroad ~]# cat test2.txt [jack@onitroad ~]# tar -xf archive.tar [jack@onitroad ~]# cat test2.txt This is test2.txt
这不会删除 .tar 文件,它会在从中提取文件后保留在原处。
- 4.解压tar文件到指定目录
默认情况下 tar 将解压缩到当前工作目录,这可能并不总是我们想要的。我们可以使用 -C 选项,而不是首先 cd 到目标目录,该选项将更改为我们执行提取时指定的目录。
[jack@onitroad ~]# mkdir new [jack@onitroad ~]# tar -xf archive.tar -C new/ [jack@onitroad ~]# ls -l new/ total 8 -rw-r--r--. 1 root root 52 Sep 2 12:24 test1.txt -rw-r--r--. 1 root root 18 Sep 2 09:42 test2.txt
- 从 Tar 文件中提取特定文件
我们可以指定要提取的特定文件,而不是提取默认的 tar 文件的所有内容。在这个例子中,我们首先删除我们从上一个例子中提取的文件,然后专门只提取 test2.txt 文件。
- 从 Tar 文件中提取特定文件
[jack@onitroad ~]# rm -f new/* [jack@onitroad ~]# tar -xf archive.tar -C new/ test2.txt [jack@onitroad ~]# ls -l new/ total 4 -rw-r--r--. 1 root root 18 Sep 2 09:42 test2.txt
我们还可以通过在命令末尾添加更多文件来一次提取多个文件。
- 显示详细信息
详细信息的 -v 选项可以添加到 tar 命令中,该选项将显示有用的添加信息,这些信息在解决问题时可能很有用。详细输出将打印添加到存档或者从存档中提取的文件和目录。
- 显示详细信息
[jack@onitroad ~]# tar -cvf archive.tar test1.txt test2.txt test1.txt test2.txt
这样我们就可以直观地看到添加到 tar 文件中的内容,而无需事后用 -t 列出内容。
- 从档案中删除
我们还可以使用 --delete 选项从 tar 文件中删除文件。在下面的例子中,我们删除了 test2.txt 文件,然后列出了 archive.tar 的内容,现在里面只剩下 test1.txt 了。
- 从档案中删除
[jack@onitroad ~]# tar -f archive.tar --delete test2.txt [jack@onitroad ~]# tar -tf archive.tar test1.txt
- 将更多文件添加到 Tar 文件
我们可以使用 -r 选项将其他文件添加到现有的 tar 文件中,该选项会将文件添加到存档中。在此示例中,我们将之前提取的 test2.txt 文件添加回存档中。
- 将更多文件添加到 Tar 文件
[jack@onitroad ~]# tar -f archive.tar -r new/test2.txt [jack@onitroad ~]# tar -tf archive.tar test1.txt new/test2.txt
请注意,这也复制了目录路径,如我们列出 tar 文件的内容时的输出所示。现在,即使我们完全删除新目录,当我们提取 archive.tar 的内容时,也会从存档中重新创建该目录。
[jack@onitroad ~]# rm -rf new/ [jack@onitroad ~]# tar -xf archive.tar [jack@onitroad ~]# ls -l new/ total 4 -rw-r--r--. 1 root root 18 Sep 2 09:42 test2.txt
- 更新档案内的文件
我们可以使用 -u 选项用文件系统上较新的文件更新 tar 文件中的现有文件,它只会添加比存档文件中的副本新的文件。
在本例中,我们将“新文本”附加到 new/test2.txt,然后用这个新文件更新 archive.tar 文件。然后我们删除新的/test2.txt 文件,将其解压并恢复,然后对内容进行分类以显示存档中的副本确实已更新。
- 更新档案内的文件
[jack@onitroad ~]# echo "new text" >> new/test2.txt [jack@onitroad ~]# tar -uf archive.tar new/test2.txt [jack@onitroad ~]# rm -f new/test2.txt [jack@onitroad ~]# tar -xf archive.tar [jack@onitroad ~]# cat new/test2.txt This is test2.txt new text
- 启用存档压缩
虽然我们总是可以在创建后压缩 tar 文件,但 tar 命令提供了允许我们在创建期间压缩存档的选项。
我们可以使用 -j 选项来压缩 bzip2. 这会将存档扩展名设置为 .tar.bz2,当我第一次运行该命令时,出现以下错误:
- 启用存档压缩
tar (child): bzip2: Cannot exec: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now
这是因为我的系统上没有安装 bzip2 软件包,一旦使用 'yum install bzip2' 安装它就可以正常工作。
[jack@onitroad ~]# tar -cjf archive.tar.bz2 test1.txt test2.txt
我们可以使用 -J 选项来压缩 xz。这会将存档扩展名设置为 .tar.xz
[jack@onitroad ~]# tar -cJf archive.tar.xz test1.txt test2.txt
我们可以使用 -z 选项来使用 gzip 进行压缩,这似乎是与 tar 一起使用的最常见的压缩方法。这会将存档扩展名设置为 .tar.gz
[jack@onitroad ~]# tar -czf archive.tar.gz test1.txt test2.txt
我们可以看到,archive.tar 的压缩版本比原始 tar 文件小很多,尽管包含相同的内容。
[jack@onitroad ~]# ls -la archive.tar* -rw-r--r--. 1 root root 10240 Sep 2 12:45 archive.tar -rw-r--r--. 1 root root 201 Sep 2 12:49 archive.tar.bz2 -rw-r--r--. 1 root root 190 Sep 2 12:47 archive.tar.gz -rw-r--r--. 1 root root 244 Sep 2 12:47 archive.tar.xz
我们之前已经调查了这些压缩方法的性能差异,如果我们有兴趣了解哪种方法最适合我们,压缩这些小文本文件并不是确定哪种压缩方法最好的好例子,通常 xz 会比bzip2,它比 gzip 压缩得更好。
我们可以从压缩存档文件中提取,而无需指定用于压缩它们的选项,tar 足够聪明,可以自行解决这个问题,因此以下命令完全有效,并将提取此压缩存档文件的内容。
[jack@onitroad ~]# tar -xf archive.tar.gz
需要注意的是,我们无法向压缩的 tar 文件添加其他文件,它们首先需要解压缩、更新,然后使用 gzip、bzip2 或者 xz 命令再次手动压缩。
[jack@onitroad ~]# tar -uf archive.tar.gz new/test2.txt tar: Cannot update compressed archives tar: Error is not recoverable: exiting now
- 创建目录存档
我们不仅需要将单个文件添加到 tar 文件中,还可以递归归档整个目录以归档所有内容。在这个例子中,我们将 /etc/ 目录中的所有内容复制到 etc.tar.gz,然后我们列出内容表明这是成功的。
- 创建目录存档
[jack@onitroad ~]# tar -czf etc.tar.gz /etc/ tar: Removing leading `/' from member names [jack@onitroad ~]# ls -l etc.tar.gz -rw-r--r--. 1 root root 7092784 Sep 2 12:56 etc.tar.gz [jack@onitroad ~]# tar -tf etc.tar.gz | head etc/ etc/crypttab etc/mtab etc/resolv.conf etc/pki/ etc/pki/rpm-gpg/ etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Debug-7 etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-Testing-7 etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
默认情况下 tar 使用 --recursion 选项运行,该选项将递归到子目录中并存档其中的内容。
- 禁用目录递归
如前面的示例所示,当我们归档目录时,默认情况下也会归档其中的子目录和内容。我们可以选择使用 --no-recursion 选项禁用目录递归,这将避免自动下降到其他目录。
此示例与前一个示例相同,但是我们可以在输出中看到列出了子目录,但是其中没有任何内容被存档,因为我们只有指定目录中的压缩文件而没有递归。
- 禁用目录递归
[jack@onitroad ~]# tar -czf etc-no-dirs.tar.gz /etc/* --no-recursion tar: Removing leading `/' from member names [jack@onitroad ~]# tar -tf etc-no-dirs.tar.gz | head etc/adjtime etc/aliases etc/aliases.db etc/alternatives/ etc/anacrontab etc/asound.conf etc/audisp/ etc/audit/ etc/avahi/ etc/bash_completion.d/
- 13.存档和文件系统的区别
我们可以使用 -d 或者 --diff 选项来告知我们存档中的文件与文件系统上的文件之间是否存在任何差异。在这个例子中,我们编辑 test2.txt 文件,然后进行比较,我们可以看到它报告修改时间和文件大小不同。当我们对未更改的 test1.txt 运行相同的代码时,我们没有输出,因为没有区别。
[jack@onitroad ~]# echo "change" >> test2.txt [jack@onitroad ~]# cat test2.txt This is test2.txt change [jack@onitroad ~]# tar -df archive.tar test2.txt test2.txt: Mod time differs test2.txt: Size differs [jack@onitroad ~]# tar -df archive.tar test1.txt [jack@onitroad ~]#
- 保留较新的文件
提取时,我们可能不想替换文件系统上比 tar 文件存档中存储的文件更新的文件(默认操作)。我们可以指定 --keep-newer-files 以确保这些较新的文件不会被存档中的较旧副本覆盖。
- 保留较新的文件
[jack@onitroad ~]# tar -xf archive.tar test2.txt --keep-newer-files tar: Current `test2.txt' is newer or same age
test2.txt 文件没有被修改,因为我们文件系统上的文件在被添加到存档后已经被更改。
- 归档后删除文件
默认情况下,当我们将文件添加到存档文件时,原始文件将保留在文件系统上。在使用 --remove-files 选项将原始文件添加到 tar 文件后,我们可以选择删除它们。虽然这将从文件系统中删除原始文件,但它们将存在于 tar 文件中。
- 归档后删除文件
[jack@onitroad ~]# tar -cvf archive.tar test1.txt test2.txt --remove-files
- 按模式排除文件
我们可以使用 --exclude 选项后跟指定的模式来排除将项目添加到存档中。在下面的示例中,我们可以看到我们有两个 .txt 文件和一个 .mp3 文件,我们不想在存档中包含 mp3 文件,因此我们将其排除在外。
- 按模式排除文件
[jack@onitroad new]# ls -l total 3336 -rw-r--r--. 1 root root 52 Sep 2 12:24 test1.txt -rw-r--r--. 1 root root 25 Sep 2 14:02 test2.txt -rw-r--r--. 1 root root 3407872 Sep 2 14:35 z.mp3 [jack@onitroad new]# tar -cvf exclude.tar --exclude=*.mp3 * test1.txt test2.txt
- 添加文件前确认
默认情况下,所有指定的文件都会自动添加到存档中,无需任何进一步确认。我们可以选择指定 -w 选项,该选项将提示我们对每个文件进行是或者否输入确认。在下面的示例中,我们为 test1.txt 输入 no,然后确认它确实已从 tar 文件中排除。
- 添加文件前确认
[jack@onitroad new]# tar -cwf confirm.tar * add `test1.txt'?n add `test2.txt'?y add `z.mp3'?y [jack@onitroad new]# tar -tf confirm.tar test2.txt z.mp3
这也适用于从存档中提取文件。
[jack@onitroad new]# tar -xwf confirm.tar extract `test2.txt'?n extract `z.mp3'?y
- POSIX ACL 支持
可以使用 --acls 选项启用对存档中文件的 POSIX ACL 支持或者使用 --no-acls 选项禁用,默认情况下使用 --no-acls,因此如果我们想要 ACL 支持,则必须指定它。
在本例中,我们使用 setfacl 命令在 test1.txt 上为 user1 设置基本 ACL,然后我们使用 --acls 创建包含此文件的 tar 文件。把原来的test1.txt文件去掉后,我们解压,运行getfacl,确认我们添加的ACL还在。
- POSIX ACL 支持
[jack@onitroad new]# setfacl -m u:user1:rw test1.txt [jack@onitroad new]# getfacl test1.txt # file: test1.txt # owner: root # group: root user::rw user:user1:rw group::r- mask::rw other::r- [jack@onitroad new]# tar -cf acls.tar test1.txt --acls [jack@onitroad new]# rm -f test1.txt [jack@onitroad new]# tar -xf acls.tar [jack@onitroad new]# getfacl test1.txt # file: test1.txt # owner: root # group: root user::rw user:user1:rw group::r- mask::rw other::r-
正如我们在使用 --acls 时所看到的,文件被解压并且 user1 的自定义 ACL 仍然存在。我们现在将删除文件并再次从 tar 文件中导出 test1.txt 而不使用 --acls,我们将看到 ACL 不再存在于文件中。
[jack@onitroad new]# rm -f test1.txt [jack@onitroad new]# tar -xf acls.tar [jack@onitroad new]# getfacl test1.txt # file: test1.txt # owner: root # group: root user::rw group::rw other::r-
- 扩展属性支持
可以使用 --xattrs 选项启用对存档中文件的扩展属性支持,也可以使用 --no-xattrs 选项禁用。
- 扩展属性支持
[jack@onitroad new]# tar -cf xattrs.tar test1.txt --xattrs
- SELinux 支持
SELinux 对存档中文件的支持可以使用 --selinux 选项启用或者使用 --no-selinux 选项禁用。
- SELinux 支持
[jack@onitroad new]# tar -cf no-selinux.tar * --no-selinux
- 设置存档文件的新用户/组所有者
我们可以在将文件添加到存档时设置文件的用户和/或者组所有者,使用 --owner=name 强制新所有者和 --group=name 强制添加文件的新组。
- 设置存档文件的新用户/组所有者
[jack@onitroad new]# tar -cf user-group-change.tar test2.txt --owner=user1 --group=user1
现在一旦我们解压了这个文件,用户和组应该被设置为 user1,而不是 root。
[jack@onitroad new]# tar -xf user-group-change.tar [jack@onitroad new]# ls -l total 3364 -rw-rw-r--. 1 root root 52 Sep 2 12:24 test1.txt -rw-r--r--. 1 user1 user1 25 Sep 2 14:02 test2.txt
- 将文件提取到标准输出
而不是从 tar 文件中提取文件到文件系统,我们可以简单地将它们发送到 stdout 而不是使用 -O 选项,如果我们只想快速读取文件的内容而不必先提取它,这可能很有用。
- 将文件提取到标准输出
[jack@onitroad new]# tar -xOf archive.tar test1.txt This is test1.txt [jack@onitroad new]# tar -xOf archive.tar test2.txt This is test2.txt
- 23.检查存档文件
我们可以尝试在创建期间使用 -W 选项验证存档文件。
[jack@onitroad new]# tar -cvWf archive.tar test1.txt test2.txt test1.txt test2.txt Verify test1.txt Verify test2.txt
GNU 磁带存档命令(tape archive),称为“tar”,用于将许多不同的文件一起存储到单个存档文件中。
这使得在基于 Unix/Linux 的操作系统中执行文件和目录的备份和恢复变得容易。