rsync命令

简介

rsync命令来自英文词组remote sync的缩写,其功能是远程数据同步。rsync命令能够基于网络(包含局域网和互联网)快速地实现多台主机间的文件同步工作。与scp或ftp命令会发送完整的文件不同,rsync有独立的文件内容差异算法,会在传送前对两个文件进行比较,只传送两者内容间的差异部分,因此速度更‍快。

语法格式

rsync 参数 目录名

常用参数

参数 描述
-b 备份指定目标文件
-o 保留文件原始所有者身份
-B 设置检验算法使用的块大小
-p 保留文件原始权限信息
-c 对文件传输进行校验
-P 显示进度信息
-d 不递归目录文件,不传输子文件
-q 使用精简输出模式
-D 保留设备文件信息
-r 递归处理所有子文件
-g 保留文件原始所有组身份
-R 使用相对路径
-h 显示帮助信息
-t 保留文件时间信息
-H 保留硬链接文件
-v 显示执行过程详细信息
-l 保留软链接文件
-x 设置不跨越文件系统边界
-n 显示将要传输的文件列表
-z 压缩文件

参考示例

  1. 将本地目录(/Dir)与远程目录(192.168.10.10:/Dir)相关联,保持文件同步:

    1
    2
    [root@linuxcool ~]# rsync -r /Dir 192.168.10.10:/Dir 
    [email protected]'s password: 此处输入远程服务器密码
  2. 将远程目录(192.168.10.10:/Dir)与本地目录(/Dir)相关联,保持文件同步:

    1
    2
    [root@linuxcool ~]# rsync -r 192.168.10.10:Dir /Dir 
    [email protected]'s password: 此处输入远程服务器密码
  3. 关联两个本地的目录,保持文件同步:

    1
    [root@linuxcool ~]# rsync -r /Dir1 /Dir2
  4. 列出本地指定目录内的文件列表:

    1
    2
    3
    [root@linuxcool ~]# rsync /Dir2/
    drwxr-xr-x 18 2023/10/19 16:46:42 .
    dr-xr-x--- 4,096 2023/10/19 16:46:54 root
  5. 列出远程指定目录内的文件列表:

    1
    2
    3
    4
    5
    6
    7
    8
    [root@linuxcool ~]# rsync 192.168.10.10:/Dir/
    [email protected]'s password: 此处输入远程服务器密码
    drwxrwxrwt 4,096 2023/10/19 16:47:41 .
    -r--r--r-- 11 2023/10/17 03:13:19 .X0-lock
    -r-------- 11 2023/10/17 03:05:57 .X1024-lock
    -rw------- 532 2023/10/17 02:31:58 .viminfo
    -rw-r--r-- 2,587 2023/10/17 02:59:47 anaconda.log
    -rw-r--r-- 2,604 2023/10/17 02:59:34 dbus.log

实战演练

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
#!/bin/bash

CURRENT_VERSION="xxx"
ARCHIVE="xxx"

# 确保目标目录存在
mkdir -p "$ARCHIVE"

# 同步当前版本内容到存档目录
rsync -av --delete "$CURRENT_VERSION" "$ARCHIVE/"

# 提示用户是否删除当前版本文件夹
read -p "Do you want to delete the current version folder? (Y/N): " choice

case "$choice" in
[Yy]* )
echo "Deleting current version folder..."
rm -rf "$CURRENT_VERSION"
echo "Current version folder deleted."
;;
[Nn]* )
echo "Current version folder not deleted."
;;
* )
echo "Invalid input. Please enter Y or N."
;;
esac

这个 Bash 脚本的目的是将当前版本的文件夹内容同步到一个存档目录中,并根据用户的选择决定是否删除当前版本的文件夹。以下是对脚本各部分的详细分析:

  1. 定义变量

    1
    2
    CURRENT_VERSION="xxx"
    ARCHIVE="xxx"
    • CURRENT_VERSION:指向当前版本的目录,这里是 xxx。
    • ARCHIVE:指向存档目录,这里是 xxx。
  2. 确保目标目录存在

    1
    mkdir -p "$ARCHIVE"
    • 使用 mkdir -p 命令确保目标存档目录存在。如果目录不存在,mkdir -p 会递归创建目录。
    • 如果目录已经存在,mkdir -p 不会报错。
  3. 同步当前版本内容到存档目录

    1
    rsync -av --delete "$CURRENT_VERSION" "$ARCHIVE/"
    • rsync -av:使用 rsync 命令同步文件和目录。
      • a:归档模式,递归同步目录,并保留符号链接、权限、时间戳、用户和组等信息。
      • v:详细模式,显示同步过程的详细信息。
    • – –delete:在目标目录中删除那些不再存在于源目录中的文件,这样目标目录与源目录保持完全同步。
    • “$CURRENT_VERSION”:源目录,即当前版本的目录 xxx。
    • “$ARCHIVE/“:目标目录,即存档目录 xxx。
  4. 提示用户是否删除当前版本文件夹

    1
    read -p "Do you want to delete the current version folder? (Y/N): " choice
    • read -p:提示用户输入选择,并将输入值存储在变量 choice 中。
  5. 根据用户输入执行操作

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    case "$choice" in
    [Yy]* )
    echo "Deleting current version folder..."
    rm -rf "$CURRENT_VERSION"
    echo "Current version folder deleted."
    ;;
    [Nn]* )
    echo "Current version folder not deleted."
    ;;
    * )
    echo "Invalid input. Please enter Y or N."
    ;;
    esac
    • case “$choice”:根据用户输入的值执行相应的操作。
      • [Yy]*:如果用户输入的是 Y 或 y 开头的任何字符,执行删除操作。
      • [Nn]*:如果用户输入的是 N 或 n 开头的任何字符,不执行删除操作。
      • *:如果用户输入了其他字符,显示无效输入的提示。
  6. 删除当前版本文件夹

    1
    rm -rf "$CURRENT_VERSION"
    • rm -rf:递归删除指定目录及其内容。
    • 在用户确认删除后,rm -rf “$CURRENT_VERSION” 将删除 ./html/ 目录及其中的所有文件和子目录。
  7. 输出操作结果或提示信息

    • echo:输出操作结果或提示信息到控制台,便于用户了解脚本执行的情况。

总结

这个脚本实现了从当前版本目录到存档目录的文件同步,并且允许用户根据需要选择是否删除当前版本的文件夹。它使用 rsync 来高效地处理文件同步,并使用 Bash 的基本条件判断和输入处理机制来控制删除操作。