Can Rsync be configured to verify the contents of the file before they are being synced. I have heard about checksum, but I came to know that checksum only does a sampling. I want to transfer a file only if it is contents are changed and not timestamp, is there a way to do it with any of the rsync modes. In my scenario, say file sample.text will be created every week and I want 开发者_StackOverflowto sync it with a remote server only if the contents of sample.text are changed, since it is created every week, the time stamp would obviously change. But I want the transfer only on a content change.
Yes:
$ man rsync | grep "\--checksum"
-c, --checksum skip based on checksum, not mod-time & size
Rsync is pretty complicated. I recommend cuddle time with the man page and experimentation with test data before using it for anything remotely important.
Most of the time, people use rsync -ac source dest
.
$ man rsync | grep "\--archive"
-a, --archive archive mode; same as -rlptgoD (no -H)
And that -rlptgoD
garbage means: recursive (r
), copy symlinks as symlinks (l
), preserve permissions (p
), preserve times (t
), preserve group (g
), preserve owner (o
), preserve device files (D
, super-user only), preserve special files (also part of D
).
The -c
or --checksum
is really what you are looking for (skip based on checksum, not mod-time & size). Your supposition that rsync only samples mtime and size is wrong.
See the --checksum
option on the rsync man page.
Also, the --size-only
option will be a faster choice if you know for sure that a change of contents also means a change of size.
Example:
#!/bin/bash
echo > diff.txt
rsync -rvcn --delete /source/ /destination/ > diff.txt
second_row=$(sed -n '2p' diff.txt)
if [ "$second_row" = "" ]; then
echo there was no change
else
echo there was change
fi
精彩评论