使用 rsync 压缩整个目录并上传到远程

使用 rsync 压缩整个目录并上传到远程

我知道我可以这样做:

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

该功能存在的问题:

  1. 无法在本地机器上完成制表符。
  2. 无法在远程服务器中完成制表符。
  3. 无法在目标路径中指定端口,这不起作用:因为被读取为第二个参数。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 的回答。

相关内容