找回密码
 注册
查看: 783|回复: 0

[其他] tar命令

[复制链接]
sheldon 发表于 2021-11-23 12:58:38 | 显示全部楼层 |阅读模式
# 2021/11/23

# 1.tar命令

    ## (1)简介

        > A. tar是Linux环境下最常用的备份工具之一(英文全拼:tape archive)。


        > B. tar [命令](https://www.linuxcool.com/)可以为Linux的文件和目录创建档案,利用 tar,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。


        > C. tar 最初被用来在磁带上创建档案,现在,用户可以在任何设备上创建档案。利用 tar [命令](https://www.linuxcool.com/),可以把一大堆的文件和目录全部打包成一个文件,这对于备份文件或将几个文件组合成为一个文件以便于网络传输是非常有用的。


    ## (2)系统版本不同tar命令参数会有些区别

```bash
#查看版本
tar --version
#执行后打印如下:
tar (GNU tar) 1.14

```


    ## (3)命令格式

```bash
tar [options] [tarfile] [other-files]
tar--long-option -function-options files
```


    ## (4)参数介绍

        ### A.常用的几个参数

```bash
#引用
-t, --list
#列出归档文件内容目录
-x, --extract, --get
#从归档文件中解析文件
-c, --create

```


            注:上面三个参数,不能同时存在,仅能使用其中一个,即t/x/c

```bash
#创建新的归档文件
-f file, --file=file

#指定备份文件,或设备,例如磁带机/dev/st0
-v, --verbose

#显示命令的执行过程
-Z, --compress, --uncompress

```


```bash
#使用compress命令处理备份文件
-z, --gzip, --gunzip, --ungzip

#使用gzip命令处理备份文件
-j, --I, --bzip
#注意:
#使用bzip2命令处理备份文件
#-z和-j都是在备份文件打包后才进行压缩的操作的,并且,该操作会影响其他的参数,后面会再提到

```


```bash
#先进入指定的目录,再释放
-C directory, --directory=directory

```


            #### 使用案例

```bash
#把/etc目录中所有的文件打包为etc.tar文件,且tar包存方在/temp目录下
tar -cvf /temp/etc.tar /etc/

#把/etc目录中所有的文件打包并使用bzip2压缩为etc.tar.bz2文件,且tar包存方在/temp
#目录下
#这里的,tar.gz或tar.bz2都是惯例,为方便标识的,例如:tgz等,并不是特定条件,
#但建议遵循惯例
tar -jcvf /temp/etc.tar.bz2 /etc

#查看备份包中的内容,若为已经压缩的文件,需加上-z或者-j参数
tar -ztvf /tmp/etc.tar.gz

#默认情况下,tar打包时都是使用相对路径的,所以,释放时,需要先进入目录目录,然后再解压
#同样的,根据使用的压缩方式,应加上-z或者-j参数
cd /temp && tar -zxvf /temp/etc.tar.gz

#这是另一种写法,结果和上面的相同,其会先进入/temp目录,然后再释放包的
tar -zxvf /temp/etc.tar.gz -C /temp

#释放单个etc/passwd文件,正如前面提到的,tar包中的是相对路径,所以不能使用“/etc/passwd”
#而且,这里不能使用-C参数,释放文件是当前路径的相对路径,并带目录释放
tar -zxvf /tmp/etc.tar.gz etc/passwd

```


            

        ### B.tar还可以支持很多额外的参数,方便我们在备份和释放的时候进行控制。

```bash
-d, --diff, --compare
#找出归档文件和文件系统的不同之处

-r, --append
#将文件附加到归档文件之后

-u, --update
#只附加比归档中新的文件

-A, --catenate
#将 tar 文件附加到归档文件之后

--concatenate
#与 -A 相同

--delete
#从归档文件中删除 (不能在磁带上!)

-N date, --newer=date, --after-date=date
#只将比指定日期更新的文件保存到备份文件

--exclude=pattern
#排除符合查找模式的文件

-P, --absolute-names
#备份文件中的文件名使用绝对路径,而不移除文件名前的“/”,默认是相对路径的

-l, --one-file-system
#复制文件或目录存放的文件系统必须和tar命令当前执行的文件系统相同,
#否则不执行;也就是讲,不处理其他分区的文件。(可忽略mount挂载分区的问题)

--mode=permissions
#备份时,把加入备份文件中的文件属性修改为指定的属性,格式和chmod命令接受的格式相同

--group=group
#备份时,把加入备份文件中的文件所属组设定成指定的组

--owner=owner
#备份时,把把加入备份文件中的文件所有者设定成指定的用户

--numeric-owner
#以UID和GID代替用户名和组名

--recursion
#递归模式(默认)

--no-recursion
#不进行递归处理,即不把指定目录下的所有文件和文件夹都备份

--newer-mtime=date
#Add only files whose contents have changed since date to the archive.
#仅增加指定日期后修改过内容的文件到备份文件中

--anchored
#排除时,排除匹配式中匹配整个文件路径(默认)

--no-anchored
#排除时,排除匹配式中可匹配“/”后的路径

--ignore-case
#排除时,排除匹配式中忽略大小写

--no-ignore-case
#排除时,排除匹配式中大小写敏感(默认)

--wildcards
#排除匹配式支持通配符(默认)

--no-wildcards
#排除匹配式不支持通配符

--wildcards-match-slash
#排除匹配式的通配符匹配“/”(默认)

--no-wildcards-match-slash
#排除匹配式的通配符不匹配“/”

-X file, --exclude-from file
#指定样式文件,供程序执行时剔除符合条件的文件

--remove-files
#删除已经加入到备份文件中的文件
```


            #### 使用案例

```bash
#创建当前目录的全备份到backup.tar文件
#(使用find的原因是,这样可以打包所有隐含文件或不符合命令规范的文件和目录)
tar cvf - `find . -print` > backup.tar

#比2005年6月1日新的文件才会备份
tar -N '2005/06/01' -zcvf home.tar.gz /home

#除/home/dmtsai目录外,/home和/etc目录的所有东西都打包
tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

#删除etc.tar文件中的etc/pbm2ppa.conf文件
tar --delete etc/pbm2ppa.conf -vf etc.tar

#把tmp.tar文件附加到etc.tar后面
tar -A tmp.tar -vf etc.tar

#根据-T参数后的样式文件list.txt,打包/etc中指定的文件,同样的,list.tx默认也是相对路径的
find . -name "*.d" -o -name "*.conf" > list.txt
tar -T list.txt -czvf etc.tar.gz /etc

#通过管道,使用一条命令实现上面相同的功能
find . -name "*.d" -o -name "*.conf" | tar -czvf etc.tar.gz -T -
```



# 2.**值得注意几个地方**

    ## (1)

        1)-f后面必 须紧跟备份文件,xxx.tar或者xxx.tar.gz

        2)使用--delete、-u、-r、-A的时候,后面跟的备份文件都必须为未压缩的,若备份文件已经压缩,需要使用gunzip先解压,操作完后再 gzip;
        也就是说,不能对tar.gz、tar.bz2等文件直接操作的;

        3)备份打包时,默认为相对路径;而排除匹配式默认也是全路径匹配的
        所以,在打包时,会提示:“tar: Removing leading `/' from member names”
        除非你使用-P参数或特定的参数指定

    ## (2)释放

```bash
-k, --keep-old-files
#还原备份文件时,不覆盖已存在的文件
-m, --modification-time, --touch
#还原文件时,不变更文件的更改时间
-p, --same-permissions
#解析许可权限信息,即保留备份文件中的权限信息
-s, --same-order, --preserve-order
#以与备份文件相同的顺序还原文件
--preserve
#等于同时设置-p和-s
--no-same-permissions
#不解析许可权限信息,这是普通用户的默认设置,仅对影响管理员的操作有影响
--no-same-owner
#不使用备份文件中的所有者信息,而以您自己的身份解析文件
--same-owner
#使用相同的文件所有者还原文件
--overwrite
#覆盖已经存在的文件和目录
--overwrite-dir
#覆盖已经存在的目录
--recursive-unlink
#释放前,先删除整个目录下所有文件的连接
#举例:
#释放文件时,设置为备份文件中的相同所有者(仅对管理员而言)
tar --same-owner -xzvf etc.tar.gz
#通过管道,把/etc目录用tar整个“拷贝”到/backup/etc,而不用建立任何临时文件
#因为根本不需要生成备份包文件,所以这里不需要-z参数
tar cvf - /etc | tar xvf - -C /backup/etc
#这里同上面的原理是一样的,只不过通过ssh直接“拷贝”到远端机器上而已
#配合ssh密钥匹配,可实现不用人工干预的备份工作
tar cvf - /etc | (ssh root@192.168.228.244 'tar xvf - -C /backup/etc')

```


    ## (3)操作磁带设备

```bash

#部分参数只适用于磁带设备,不适用于常规的磁盘文件。

-K file, --starting-file=file
#从指定的文件开始还原(按顺序)
-L length, --tape-length=length
#设置磁带的容量,单位为1024字节(bytes)
-M, --multivolume
#在建立、还原备份文件或列出其中内容时,采用多卷模式(不能对文件操作)
-V name, --label=name
#建立使用指定卷标的备份文件
-W, --verify
#写入备份文件后,校验文件是否正常
-F script, --info-script=script, --new-volume-script=script
#更换磁带时执行指定的脚本文件,必须与参数-M同时使用
#举例:
#把/bin、/usr/bin目录都打包到st0磁带设备中
tar cvf /dev/st0 /bin /usr/bin
#把old.dmp文件追加到st0磁带中(使用cvf,会删除原来的文件的)
#Linux下使用磁带机的简单方法,可以见这里:
tar rvf /dev/st0 old.dmp
```


## (4)其他

```Bash

#还有一些控制参数这里不详细讨论了,请自行测试。
#但提醒一句,-T参数比较重要哦。

--null
#-T从null设备读取文件名,覆盖-C的设置

-o, --old-archive, --portability
#将数据写入备份文件时使用V7格式

--posix
#将数据写入备份文件时使用POSIX格式

-G, --incremental
#处理旧GNU格式的增量备份

--rsh-command=command
#不使用rsh命令连接远程主机,而使用指定的命令进行

--suffix=suffix
#指定要删除文件前备份文件,该备份文件使用的后缀,默认是“~”

--totals
#创建备份文件时,列出已建立的备份文件的大小

tar --totals -cvf tmp.tar tmp/
-R, --block-number
#在输出信息时,一同block number信息

-S, --sparse
#若文件中有大量连续0字节时,将该文件保存成稀疏文件

-T file, --files-from=file
#指定样式文件,文件内容为一个或多个条件样式,供程序还原或创建符合指定条件的文件

--use-compress-program=program
#使用指定的压缩程序对备份文件压缩或解压

--volno-file=FILE
#使用或更新FILE文件中指定的卷号码

-w, --interactive, --confirmation
#当遇到问题时,要求用户先确认

-B, --read-full-records
#读取数据是重设扇区大小,仅适用于BSD 4.2的管道操作

-O, --to-stdout
#把从备份文件里还原的文件输出到标准输出设备

--version
#版本信息

--help
#帮助信息
```




您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|Linux公社论坛

GMT+8, 2023-6-10 23:44 , Processed in 0.062500 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表