为什么 rsync 有时无法覆盖我的本地文件?

为什么 rsync 有时无法覆盖我的本地文件?

我有一个名为的脚本copy-site,用于将站点从生产服务器复制到本地机器。copy-site example.net/httpdocs/ example.local/httpdocs/将进行一次空运行 rsync;添加第三个参数true是否进行真正的复制。

有时,本地文件已被编辑。在这种情况下,我想rsync丢弃我的本地编辑,用服务器上的内容覆盖它们。但是,它通常不会这样做。它也不会在错误日志中显示任何相关内容。我尝试将 stderr 重定向到日志文件,但它通常是空的或包含有关无法访问远程服务器上的目录的警告;它没有提到不要覆盖某些文件。当然它可以访问这些文件:如果我删除本地副本,然后再次运行它,它会完美地创建它们,作为服务器上它们的完美副本。

-I今天添加了标志,但没有什么明显的区别。

#!/bin/bash

if [ "$3" = true ]
then
    echo "real rsync";
    echo "deleting files";
    find $2 -type f -name ".*" -delete;
    echo "rsync running now";
    rsync -avziI --verbose --exclude-from /home/trig/copy-site-exclude -e 'ssh -p 2201' [email protected]:/var/www/vhosts/$1 $2 --append-verify --delete;
    notify-send -i "$([ $? = 0 ] && echo terminal || echo error)" "copy site" "rsync complete";
    echo "setting permissions";
    chmod -R 0777 $2;
    notify-send -i terminal "copy site" "full permissions granted";
else
    echo "dry run rsync";
    rsync -avziI --verbose --exclude-from /home/trig/copy-site-exclude -e 'ssh -p 2201' [email protected]:/var/www/vhosts/$1 $2 --append-verify --delete --dry-run;
    notify-send -i terminal "copy site" "dry run complete";
fi

copy-site-exclude仅仅是图像缩略图的列表(标识为以点开头),我不在乎传输它们,因为它们可以在本地重新生成。

custom/public/images/.*.jpg
custom/public/images/.*.png
custom/public/images/.*.gif
custom/public/images/.*.jpeg

我需要向 rsync 传递哪些标志以使其放弃所有本地更改,以便我的本地文件夹完美反映服务器上的源文件夹?

本地操作系统:Ubuntu。
服务器操作系统:CentOS。

答案1

好吧,简化命令(删除-z--append-verify标志)似乎已经解决了问题。但是,我仍然想知道这里到底发生了什么。从我的阅读来看,这些标志不应该会导致无法覆盖(或删除)某些本地文件。

这条线路现在

rsync -avi --verbose --exclude-from /home/trig/copy-site-exclude -e 'ssh -p 2201' [email protected]:/var/www/vhosts/$1 $2 --delete;

我不确定这是答案(我已经解决了眼前的问题)还是新问题(为什么会发生这种情况?)。无论如何,我会把它留在这里。

相关内容