【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 tgttgt├── etc│ └── ufw├── opt│ ├── data│ └── src└── var└── www
如果不想保留完整目录,只想使用最后一级目录中的中的内容,加以增加一个参数 --no-relative
$ rsync -rvh --no-relative --files-from=filelist.txt tgt
最终目录会去掉源目录中的父目录,只保留最终目录中的内容。效果有点像把多个目录中的内容合并到一个目录中。
文件列表也可以使用相对路径,但要求以源目录为起点,比如:
$ cat /root/src/filelist.txtetc/ufwvar/wwwopt
当执行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
全文完。
如果转发本文,文末务必注明:“转自微信公众号:生有可恋”。

浙公网安备 33010602011771号