导语:在工作和生活中,我们经常需要将文件从一个地方复制到另一个地方。传统的复制方法费时费力,而今天我们要介绍的 rsync 命令则可以轻松解决这个问题。本文将详细介绍 rsync 的用法,让你轻松掌握文件同步的技巧。
目录
一、rsync简介
二、rsync的基本用法
1、本地同步
2、远程同步
3、增量同步
三、rsync的高级用法
1、排除指定文件或目录
2、保留文件属性
3、监视文件变化并自动同步
四、rsync的妙用
rsync 是一款强大的文件同步工具,可以在本地和远程系统之间进行文件传输。它支持多种协议,包括 FTP、SFTP、SSH 等,可以适应不同的网络环境。rsync 具有高效、灵活和安全的特点,被广泛应用于个人和企业级文件同步。
在本地系统之间同步文件,可以直接使用 rsync 命令。例如,要将当前目录下的文件同步到目标目录,例如:
rsync -avz /path/to/source /path/to/destination
其中,-a 表示归档模式,将文件和目录结构一并复制;-v 表示详细输出,显示同步过程中的信息;-z 表示压缩传输,减少网络开销;/path/to/source 为源目录路径,/path/to/destination 为目标目录路径。
如果要远程同步文件,需要使用 SSH 协议进行身份验证,可以使用密码或者 RSA 密钥认证,如果未配置 RSA 密钥,命令行会提示输入用户的密码。例如,要将本地文件同步到远程服务器上,例如:
rsync -avz /path/to/source username@remote_host:/path/to/destination
其中,username为远程服务器的用户名,remote_host为远程服务器的IP地址或域名。如果远程服务器不是使用默认的 22 端口怎么办?文章第 4 部分妙用中有提及。后面介绍的其它选项,也适用于远程同步。
增量同步是指仅将新文件或变更的文件同步到目标目录。增量同步可以减少数据传输的网络流量,提升同步速度和效率。可用于工作目录备份、应用更新等场景,例如:
rsync -auvz /path/to/source /path/to/destination
相比之前的命令,增加了 -u 选项,该选项表示跳过目标目录比源目录更新的文件。
在使用 rsync 复制文件时,可以使用 --exclude 选项排除指定文件或目录。例如,要排除名为 .git 的目录,例如:
rsync -avz --exclude='.git' /path/to/source /path/to/destination
如果要排除多个文件或目录,使用 --exclude-from=FILE 选项,将需要排除的文件或目录列出在 FILE 文件中,一个文件或目录占一行。文件或目录可以使用模式匹配。
在使用 rsync 复制文件时,默认情况下会保留源文件的属性,如权限、时间戳等。如果要保留目标文件的属性,可以使用 --no-dereference 选项。例如:
rsync -avz --no-dereference /path/to/source /path/to/destination
如果要监视源目录的变化并自动同步到目标目录,可以使用 --watch 选项。例如:
rsync -avz --watch /path/to/source /path/to/destination
在网络环境不稳定的情况下,大文件传输面临着诸如传输速度慢、频繁中断等挑战。此时,我们需要进行长时间且多次的传输。可以通过循环来实现无人值守,每次 rsync 传输结束后,检查其返回码,如果返回码为0,表示文件传输已完成;若非0,则表示传输过程中断或出错,将再次启动传输过程。例如:
while true; do
rsync --append -P -e 'ssh -p 9022' username@remote_host:/path/to/xxx.iso /path/to/destination
if [ $? == 0 ]; then
exit
fi
done
其中,--append 表示追加数据到较短的文件,会在增量同步时计算文件大小并直接追加新的数据到文件,节省IO校验的过程;-P 等同于 --partial --progress,--partial 表示保留部分传输的文件,即中断后可断点续传,--progress 表示显示传输过程中的进度;-e 表示指定要使用的远程 shell,在它后面的内容中指定 ssh 及其端口。while 循环中,rsync 命令执行后,通过 $? 判断该命令的返回码是否为 0 来判断传输是否完成。上述内容可以放在 shell 文件中执行,也可以修改为一条命令直接在命令行执行。修改后如下:
while true; do\
rsync --append -P -e 'ssh -p 9022' username@remote_host:/path/to/xxx.iso /path/to/destination;\
if [ $? == 0 ]; then\
exit;\
fi;\
done
也就是在每行结尾处添加一个反斜线 \ 表示续行,每个 shell 命令结束时添加分号 ; 以示命令结束。也可以将换行符删除,修改后如下:
while true; do rsync --append -P -e 'ssh -p 9022' username@remote_host:/path/to/xxx.iso /path/to/destination; if [ $? == 0 ]; then exit; fi;done
最后还有一点,就是要为 username 配置 SSH 免密登录,也可以使用 sshpass 命令来自动输入密码,这样就可以真正无人值守。