【shell】rsync 按列表进行同步

rsync 中有一个参数--files-from可以按照文件列表中的内容进行同步,即按目录列表进行同步。

 

首先要准备一个目录列表,比如:

$ cat filelist.txt
/etc/ufw
/var/www
/opt

如果需要同步以上三个目录,正常情况需要对每个目录执行rsync。当使用 --files-from 参数时,可以批量对多个目录执行同步。

 

同步命令为:

$ rsync -rvh --files-from=filelist.txt / tgt

 

其中文件列表filelist.txt中的目录使用的是绝对目录,此时需要以根目录为起点。

 

最终同步后的目录结构为:

$ tree -L 2 tgt
tgt
├── etc
│   └── ufw
├── opt
│   ├── data
│   └── src
└── var
└── www

 

如果不想保留完整目录,只想使用最后一级目录中的中的内容,加以增加一个参数 --no-relative

$ rsync -rvh --no-relative --files-from=filelist.txt  tgt

最终目录会去掉源目录中的父目录,只保留最终目录中的内容。效果有点像把多个目录中的内容合并到一个目录中。

 

文件列表也可以使用相对路径,但要求以源目录为起点,比如:

$ cat /root/src/filelist.txt
etc/ufw
var/www
opt

当执行rsync时,文件内容中的目录不是绝对路径,绝对路径应该是:

/root/src/etc/ufw
/root/src/var/www
/root/src/opt

执行rsync,类似先执行cd切换到源目录,再从文件列表中读取目录进行同步 :

$ rsync -rvh --files-from=filelist.txt root/src/ tgt

如果可以,最好还是使用绝对路径,因为文件列表不支持使用../ 来切换路径。所有需要同步的目录在同一个目录下还好,如果跨目录使用相对路径就不支持了。

 

这个--files-from参数改变了 rsync 的默认行为,所以在比对文件时它会重复同步。为避免每次执行都重复拷贝,需要加一个 --size-only 参数,即只比对大小。

 

这里的目录端使用了本地目录,如果需要将文件传输到远程主机,换成远程目录即可,比如:

$ rsync -rvh --files-from=filelist.txt /  root@192.168.1.1:/tgt

全文完。

 

如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

posted @ 2025-09-23 15:32  xjce  阅读(15)  评论(0)    收藏  举报