我知道我可以这样做:
rsync -zaP uploads/ myserver:/path/to/
如果我理解正确的话,这将压缩该目录中的每个文件并逐个同步到服务器。但如果有数千个文件,则需要一些时间。压缩整个目录并上传会更快。
那么,有没有一种瓷器方法可以让我做到这一点rsync
?
辅助函数
我编写了一个小 bash 函数来压缩和移动整个目录rsync
。您如何简化它或使它变得更好?
function zipsync() {
# Arguments
local source=$1
local target=$2
# Get the host and path from the $target string
IFS=':' read -a array <<< "$target"
local host=${array[0]}
local remote_path=${array[1]}
# The archive file locations
local remote_archive=${remote_path}${source}.tar.gz
local local_archive=${source}.tar.gz
# Colors
cya='\033[0;36m'; gre='\033[0;32m'; rcol='\033[0m'
echo -e "$cya Compressing files $rcol"
tar -zcvf $local_archive $source
echo -e "$cya Syncing files $rcol"
rsync -avP $local_archive $target
echo -e "$cya Extracting file in remote $remote_archive $rcol"
ssh $host "cd ${remote_path}; tar zxvf ${remote_archive}"
echo -e "$cya Removing the archives $rcol"
ssh $host "rm $remote_archive"
rm $local_archive
echo -e "$gre All done :) $rcol"
}
句法:
zipsync source target
例子:
$ zipsync uploads my_server:/var/www/example.com/public_html
该功能存在的问题:
- 无法在本地机器上完成制表符。
- 无法在远程服务器中完成制表符。
- 无法在目标路径中指定端口,这不起作用:因为被读取为第二个参数。
zipsync uploads -p 5555 [email protected]:/path/
-p
我的目标是制作一个真正易于使用和重新组装的命令rsync
。
答案1
如果我理解正确的话,
rsync -zaP uploads/ myserver:/path/to/
将压缩该目录下的每个文件并逐个同步到服务器。
这是不正确的。该rsync
命令查看本地文件,将其与远程文件(如果有)进行比较,然后同步差异到服务器。如果没有匹配的远程文件,则不会提高速度。但是,对于只有部分文件发生更改的后续上传,速度可能会大幅提高。该-z
标志尝试对通过链接传输的数据应用压缩。
但如果文件数以千计,那么这将需要一些时间。压缩整个目录并上传会更快。那么,有没有一种简单的方法可以用 rsync 来做到这一点?
您的理解有误,所以我认为这个问题没有意义。您的帖子的其余部分似乎不是问题,所以我不确定您期望什么答案。如果我错了,请更新问题。
答案2
如果您只想在目标为空的情况下运行一次,那么速度会更快。
但是您的函数过于复杂。
您只需运行:
tar zcvf - /source | ssh destination.example.com "cd /destination; tar xvzf -"
如果您想运行同步来同步更改,请参阅 roaima 的回答。