文件归档和备份

归档和压缩文件对于创建备份和通过网络传输数据非常有用。

用于创建和使用备份存档的最古老和最常用的命令之一是 tar 命令。

tar 可以将大量文件集合到一个文件(存档)中,还可以使用 gzip,bzip2或xz压缩来压缩存档。

tar 命令语法

核心动作参数

参数 作用
-c 创建新压缩包
-x 解压文件
-t 查看压缩包内容列表
-r 向已有压缩包追加文件

常用辅助参数

参数 功能说明
-v 显示详细过程
-f 指定压缩包文件名
-C 指定解压目标路径
–exclude 排除指定文件/目录

压缩格式参数

参数 压缩类型 后缀
-z gzip 压缩 .tar.gz / .tgz
-j bzip2 压缩 .tar.bz2
-J xz 高压缩 .tar.xz

tar 包管理

创建一个 tar 包

# 创建tar包,确保用户有权限访问目标文件
[gsb@server ~ 14:38:19]$ tar -cf etc.tar /etc 
tar: 从成员名中删除开头的“/”
tar: /etc/crypttab:无法 open: 权限不够
tar: /etc/grub.d:无法 open: 权限不够
tar: /etc/pki/CA/private:无法 open: 权限不够
tar: /etc/pki/rsyslog:无法 open: 权限不够
tar: /etc/lvm/archive:无法 open: 权限不够
....
# 没有权限读取的文件,当然无法打包

# root 用户可以打包所有文件
[root@server ~ 14:38:12]# tar -cf etc.tar /etc
tar: 从成员名中删除开头的“/”
# 注意打包的时候,会将文件的第一个字符/剔除掉。解压的时候,默认解压到当前位置。

# 再次打包,如果存在相同的tar包,不会提示是否覆盖
[root@centos7 ~]# tar -cf etc.tar /etc
tar: 从成员名中删除开头的“/”

# 通过添加日期,确保每天打包的文件名不一致
[root@server ~ 14:40:48]# tar -cf etc.tar /etc
tar: 从成员名中删除开头的“/”
[root@server ~ 14:41:06]# ls
anaconda-ks.cfg  etc.tar

[root@server ~ 14:41:17]# tar -cf etc.$(date +%Y%m%d).tar /etc
tar: 从成员名中删除开头的“/”
[root@server ~ 14:43:18]# ls
anaconda-ks.cfg  etc.20260517.tar  etc.tar

查看 tar 包中文件

# 查看tar包内容
[root@server ~ 14:43:45]# tar -t -f etc.20260517.tar 
etc/
etc/fstab
etc/crypttab
etc/mtab
etc/resolv.conf
etc/grub.d/
etc/grub.d/00_header
......

# 配合grep过滤
[root@server ~ 14:44:38]# tar -t -f etc.20260517.tar |grep etc/host
etc/host.conf
etc/hosts
etc/hosts.allow
etc/hosts.deny
etc/hostname

提取 tar 包中文件

# 提取所有文件
root@server ~ 14:45:21]# tar -xf etc.20260517.tar 
[root@server ~ 14:45:52]# ls
anaconda-ks.cfg  etc  etc.20260517.tar  etc.tar

# 查看其中一个子目录
[root@server ~ 14:48:13]# tree -L 1 etc/yum
etc/yum
├── fssnap.d
├── pluginconf.d
├── protected.d
├── vars
└── version-groups.conf
4 directories, 1 file

# 提取部分文件
[root@server ~ 14:48:52]# tar -t -f etc.20260517.tar |grep etc/host
etc/host.conf
etc/hosts
etc/hosts.allow
etc/hosts.deny
etc/hostname
[root@server ~ 14:49:14]# tar -x -f etc.20260517.tar $(tar -t -f etc.20260517.tar|grep etc/host)
[root@server ~ 14:50:43]# tree etc
etc
├── adjtime
├── aliases
├── aliases.db
├── alternatives
│   ├── ld -> /usr/bin/ld.bfd
│   ├── libnssckbi.so.x86_64 -> /usr/lib64/pkcs11/p11-kit-trust.so
│   ├── mta -> /usr/sbin/sendmail.postfix
│   ├── mta-aliasesman -> /usr/share/man/man5/aliases.postfix.5.gz
│   ├── mta-mailq -> /usr/bin/mailq.postfix
│   ├── mta-mailqman -> /usr/share/man/man1/mailq.postfix.1.gz
│   ├── mta-newaliases -> /usr/bin/newaliases.postfix
│   ├── mta-newaliasesman -> /usr/share/man/man1/newaliases.postfix.1.gz
│   ├── mta-pam -> /etc/pam.d/smtp.postfix
│   ├── mta-rmail -> /usr/bin/rmail.postfix
.....

tar 包中追加文件

 [root@server ~ 15:01:12]# tar -r -f etc.20260517.tar /tmp/mycfg.txt 
tar: 从成员名中删除开头的“/”

tar -tf:列出 tar 包里的所有文件(-t 是查看,-f 是指定文件名)
[root@server ~ 15:01:43]# tar -tf etc.20260517.tar |grep mycfg.txt
tmp/mycfg.txt

删除 tar 包中文件

[root@server ~ 15:03:16]# tar --delete -f etc.20260517.tar tmp/mycfg.txt
[root@server ~ 15:03:57]# tar -tf etc.20260517.tar |grep mycfg.txt

tar 包压缩管理

tar 命令支持多种压缩方法:

  • gzip:-z, --gzip 文件名通常以.tar.gz结尾。最快,最老,使用最广泛。
  • bzip2:-j, --bzip2 文件名通常以.tar.bz2结尾。压缩后比gzip小,没gzip使用广泛。
  • xz:-J, --xz 文件名通常以.tar.xz结尾。比较新,更好的压缩比

压缩的效果取决于被压缩的对象,例如已经压缩的图片或者rpm包,压缩效果不明显。

# 确保相关压缩工具已经安装了
[root@centos7 ~]# yum install gzip bzip2 xz

# gzip压缩
[root@server ~ 15:05:28]# time tar -czf etc.tar.gz /etc
tar: 从成员名中删除开头的“/”

real	0m1.467s
user	0m0.645s
sys	    0m0.913s

# bzip2 压缩
[root@server ~ 15:06:07]# time tar -cjf etc.tar.bz2 /etc
tar: 从成员名中删除开头的“/”

real	0m3.851s
user	0m3.420s
sys  	0m0.503s

# xz 压缩
[root@server ~ 15:06:28]# time tar -cJf etc.tar.xz /etc
tar: 从成员名中删除开头的“/”

real	0m19.046s
user	0m18.537s
sys	    0m0.574s

[root@server ~ 15:07:03]# ll -lh etc*
-rw-r--r-- 1 root root 8.8M 517 15:06 etc.tar.bz2
-rw-r--r-- 1 root root  10M 517 15:06 etc.tar.gz
-rw-r--r-- 1 root root 7.2M 517 15:07 etc.tar.xz

# 查看压缩的 tar 包不需要指定压缩选项
[root@server ~ 15:08:47]# tar -tf etc.tar.gz

系统间复制文档

windows 和 Linux 之间传输

xshell 工具

Linux服务器安装 lrzsz 软件包。该方式传输速度比ftp慢。

[root@centos7 ~]# yum install -y lrzsz

上传:直接将文件拖拽到命令行窗口即可。

在这里插入图片描述

拉取:使用 sz 工具,并指定保存位置。

  • sz (Send):把文件从 Linux 服务器“发送”出来,也就是下载到本地。
  • rz (Receive):把文件从本地“接收”进去,也就是上传到 Linux 服务器。

在这里插入图片描述

Linux 之间传输

scp 命令

scp,全名secure copy,也就是安全复制,是基于ssh协议,也就是说Linux服务器要开启ssh服务。

为了方便上传和下载,提前配置好秘钥登录服务器。

[root@client ~ 15:22:04]# scp root@server:/root/etc.tar.gz .
etc.tar.gz                                                      100%   10MB  42.5MB/s   00:00    
[root@client ~ 15:23:39]# ls 
anaconda-ks.cfg  etc.tar.gz

# 复制多个文件
[root@client ~ 15:23:44]# scp root@server:/root/{etc.tar.bz2,etc.tar.xz} .
etc.tar.bz2                                                     100% 8973KB  43.0MB/s   00:00    
etc.tar.xz                                                      100% 7296KB  35.4MB/s   00:00    
[root@client ~ 15:26:27]# ls
anaconda-ks.cfg  etc.tar.bz2  etc.tar.gz  etc.tar.xz

# 复制目录,使用 -r 选项
[root@server ~ 15:18:24]# mkdir csgo
[root@client ~ 15:31:12]# scp -r root@server:/root/csgo/ .
[root@client ~ 15:32:01]# ls
[root@client ~ 15:32:13]# ls
anaconda-ks.cfg  csgo  etc.tar.bz2  etc.tar.gz  etc.tar.xz

# 上传,如果路径没有写,表示相对用户家目录。这里是上传到root用户家目录/root
[root@client ~ 15:37:19]# scp 1.txt root@server:
1.txt                                                           100%    0     0.0KB/s   00:00 
[root@server ~ 15:30:53]# ls
1.txt  anaconda-ks.cfg  csgo  etc.tar.bz2  etc.tar.gz  etc.tar.xz  mycfg.txt.txt
...

scp 命令缺点:不管目的位置是否有文件,总是再复制一次,可以理解为全量备份。缺少比对功能。

rsync 命令

Rsync(Remote Synchronize)是一款开源的、快速的、多功能的、远程数据同步备份工具,并且支持多种操作系统平台运行。

Rsync具有本地与远程两台主机之间的数据快速复制同步镜像、远程备份等功能,该功能类似scp,但是优于scp功能,还具有本地不同分区目录之间全量及增量复制数据。

Rsync同步数据镜像时,通过“quick check”算法,仅同步大小或最后修改时间发生变化的文件或目录,当然也可以根据权限,属主等属性变化的同步,所以可以实现快速同步。

前提:客户端和服务端都要提前安装好 rsync 软件包。

# 安装 rsync
[root@server ~ 15:38:50]# yum install -y rsync
shell 模式

shell 模式是基于 sshd 服务传送。

语法:

rsync [OPTION]… SRC DEST
rsync [OPTION]… SRC [USER@]HOST:DEST
rsync [OPTION]… [USER@]HOST:SRC DEST

常用选项

  • -n 参数执行空运行,与真实执行显示结果一致,但是没有做任何改变。
  • -v 显示执行过程中详细输出。
  • -a 代表“archive mode”,同时启用参数:-r -l -p -t -g -o -D
  • -r 递归同步整个文件夹
  • -l 同步软连接
  • -p 保留权限
  • -t 保留时间戳
  • -g 保留所属组
  • -o 保留所有者
  • -D 同步设备文件

说明:

  • -A,同步时保留ACLs内容。
  • -X 同步时保留selinux内容。-a,不同步acl selinux内容。
# 准备文件
[root@client ~ 15:43:02]# touch csgo/niko{1..5}.jpg

# 首次同步
[root@client ~ 15:44:20]# rsync -av  csgo root@server:
sending incremental file list
csgo/
csgo/niko1.jpg
csgo/niko2.jpg
csgo/niko3.jpg
csgo/niko4.jpg
csgo/niko5.jpg

sent 347 bytes  received 115 bytes  924.00 bytes/sec
total size is 0  speedup is 0.00


# 再次同步
[root@client ~ 15:45:46]# rsync -av  csgo root@server:
sending incremental file list

sent 149 bytes  received 17 bytes  332.00 bytes/sec
total size is 0  speedup is 0.00

# 更新部分文件时间戳,再同步
[root@client ~ 15:45:52]# touch csgo/niko{1,2}*
[root@client ~ 15:47:05]# rsync -av  csgo root@server:
sending incremental file list
csgo/niko1.jpg
csgo/niko2.jpg

sent 235 bytes  received 55 bytes  580.00 bytes/sec
total size is 0  speedup is 0.00

# 删除 SRC 中文件,默认不会同步删除DEST中文件
[root@client ~ 15:47:19]# rm -f csgo/niko3.jpg
[root@client ~ 15:48:15]# rsync -av  csgo root@server:
sending incremental file list
csgo/

sent 139 bytes  received 20 bytes  318.00 bytes/sec
total size is 0  speedup is 0.00

# 使用选项 --delete 同步删除 DEST 中文件
[root@client ~ 15:48:53]# rsync -av  csgo root@server: --delete
sending incremental file list
deleting csgo/niko3.jpg

sent 140 bytes  received 31 bytes  342.00 bytes/sec
total size is 0  speedup is 0.00

将目标文件拉取到本地,操作过程一致。

同步注意事项:

  • 文件访问时间等属性、读写等权限、文件内容等有任何变动,都会被认为修改。
  • 目标目录下如果文件比源目录还新,则不会同步。
  • 源路径的最后是否有斜杠有不同的含义:
  • 有斜杠,只是复制目录中的文件。
  • 没有斜杠的话,不但要复制目录中的文件,还要复制目录本身。
daemon 模式

daemon 模式,不依赖 ssh 服务。

daemon 模式要求:服务端部署 rsynrc 服务。

  • **语法1:**源路径或目的路径的主机名后面包含两个冒号。
  • **语法2:**rsync://URL格式。
rsync [OPTION]… SRC [USER@]HOST::DEST
rsync [OPTION][USER@]HOST::SRC DEST
rsync [OPTION]… rsync://[USER@]HOST[:PORT]/SRC [DEST]
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐