我使用了rsync
很长时间,它按照要求完美工作,但我遇到了一种情况,目标服务器文件每隔几秒钟移动一次,并rsync
从本地 sftp 服务器再次复制相同的文件。我正在使用--ignore-existing
命令,但在这种情况下它也不起作用。
sshpass -p "ABCDE" rsync -avvtzh --ignore-existing -e "ssh -o StrictHostKeyChecking=no" --log-file="/home/toor/log/uc.log" [email protected]:share/CACHEDEV1_DATA/Lanein1/Unicard/ /home/toor/UCDownloads/
答案1
如果目标文件已被移动,那么就其而言,rsync
它们不再存在。该--ignore-existing
标志没有用,因为文件不存在于预期的位置,因此没有什么可以忽略的。
您可以创建一个标志文件,并仅推送自上次成功rsync
运行以来修改的文件。像这样的骨架可以工作(它比您想象的更复杂,因为文件的源位于您的远程系统而不是本地):
path='/share/CACHEDEV1_DATA/Lanein1/Unicard'
flag="$path.flag"
# Must have a flag file. If we don't then create one from the epoch
if ssh -nq [email protected] "[ ! -f '$flag' ]"
then
touch -t 197001010000 /tmp/1970
scp -p /tmp/1970.flag [email protected]:"$flag"
rm -f /tmp/1970.flag
fi
# Flag the start of the synchronisation
ssh -nq [email protected] "date >'$flag.tmp'"
# Copy files newer than the flag
if ssh -nq [email protected] "find '$path/' -depth -newer '$flag' -print0 |
rsync -avz --files-from - --from0 [email protected]:/ /home/toor/UCDownloads/
then
# Install the new flag
ssh -nq [email protected] "mv -f '$flag.tmp' '$flag'"
fi
对于那些不熟悉 QNAP 的人来说,该touch
命令并不作为标准存在,并且rsync
其功能被削减。我在本地客户端上使用它touch
创建了一个日期为 1970-01-01 的文件,然后将其作为初始标志传输到远程系统。 (如果touch
存在于远程系统上,那么首先远程创建该文件会容易得多。)find
仅包括自标记日期以来创建/修改的文件和目录。