A destination tree can receive edits after its source snapshot was created, so copying the older snapshot without a receiver-side guard can replace work that should survive. The rsync --update rule protects regular destination files whose modification time is newer while still allowing older and missing files to be synchronized.

Archive mode supplies the timestamp preservation that this decision needs because -a includes -t. An equal source and destination time does not guarantee a skip: rsync can still update the destination when the file sizes differ, and a source/destination file-type mismatch is handled regardless of the timestamps.

Modification times are only trustworthy when the systems that wrote both trees have synchronized clocks and no later process has manipulated the timestamps. The option compares metadata rather than file contents, so use hashes when an important destination edit must be distinguished from an older source revision.

Steps to skip newer destination files with rsync:

  1. Compare the source and destination modification times before the transfer.
    $ stat -c '%n | %y' /srv/fixture/source/newer.txt /srv/fixture/destination/newer.txt /srv/fixture/source/older.txt /srv/fixture/destination/older.txt
    /srv/fixture/source/newer.txt | 2026-07-11 09:00:00.000000000 +0000
    /srv/fixture/destination/newer.txt | 2026-07-11 10:00:00.000000000 +0000
    /srv/fixture/source/older.txt | 2026-07-11 10:00:00.000000000 +0000
    /srv/fixture/destination/older.txt | 2026-07-11 09:00:00.000000000 +0000

    A clock difference between the systems can make an older file appear newer. Synchronize their clocks before relying on modification times to protect destination content.

  2. Record hashes for the files that exist before synchronization.
    $ sha256sum /srv/fixture/source/newer.txt /srv/fixture/destination/newer.txt /srv/fixture/source/older.txt /srv/fixture/destination/older.txt /srv/fixture/source/missing.txt
    37af4e33d32d83a66e8729e4719c057dea67e09ed6bec255803cb74602fa3edf  /srv/fixture/source/newer.txt
    761517461412cc75cecad8f3067f3ac968d5fb94f06cf641748dd2f20e4a6125  /srv/fixture/destination/newer.txt
    88e41e59e2af6224419a18a2594352fe011e9cee9510d58c3f644d2cca265317  /srv/fixture/source/older.txt
    41420b8aa72f47453470557fa0eba372f1f6c6fd6ff354fa9f4d62c7c33b5bf7  /srv/fixture/destination/older.txt
    e8f87a3d4fb00513b6a58cd46c6a3bbb71455b994cb9f5611108f51db312d9f0  /srv/fixture/source/missing.txt
  3. Preview the synchronization with update protection and skip-reason output.
    $ rsync -a --update --dry-run --itemize-changes --info=skip2 /srv/fixture/source/ /srv/fixture/destination/
    newer.txt is newer
    >f+++++++++ missing.txt
    >f.st...... older.txt

    The skip message identifies the protected receiver file. The itemized lines identify the missing and older files that will be written.
    Related: How to preview rsync changes before syncing

  4. Back up destination edits that must survive regardless of timestamp before starting the live transfer.

    The next command replaces destination files judged older and creates missing paths. Avoid combining --update with --inplace for interrupted-transfer recovery because a partial receiver file can receive a newer timestamp and then be skipped on the retry.
    Related: How to resume an interrupted rsync transfer

  5. Run the same synchronization without --dry-run after checking the preview.
    $ rsync -a --update --itemize-changes --info=skip2 /srv/fixture/source/ /srv/fixture/destination/
    newer.txt is newer
    >f+++++++++ missing.txt
    >f.st...... older.txt
  6. Check the modification times after synchronization.
    $ stat -c '%n | %y' /srv/fixture/source/newer.txt /srv/fixture/destination/newer.txt /srv/fixture/source/older.txt /srv/fixture/destination/older.txt /srv/fixture/source/missing.txt /srv/fixture/destination/missing.txt
    /srv/fixture/source/newer.txt | 2026-07-11 09:00:00.000000000 +0000
    /srv/fixture/destination/newer.txt | 2026-07-11 10:00:00.000000000 +0000
    /srv/fixture/source/older.txt | 2026-07-11 10:00:00.000000000 +0000
    /srv/fixture/destination/older.txt | 2026-07-11 10:00:00.000000000 +0000
    /srv/fixture/source/missing.txt | 2026-07-11 10:00:00.000000000 +0000
    /srv/fixture/destination/missing.txt | 2026-07-11 10:00:00.000000000 +0000
  7. Verify the resulting file contents with SHA-256 hashes.
    $ sha256sum /srv/fixture/source/newer.txt /srv/fixture/destination/newer.txt /srv/fixture/source/older.txt /srv/fixture/destination/older.txt /srv/fixture/source/missing.txt /srv/fixture/destination/missing.txt
    37af4e33d32d83a66e8729e4719c057dea67e09ed6bec255803cb74602fa3edf  /srv/fixture/source/newer.txt
    761517461412cc75cecad8f3067f3ac968d5fb94f06cf641748dd2f20e4a6125  /srv/fixture/destination/newer.txt
    88e41e59e2af6224419a18a2594352fe011e9cee9510d58c3f644d2cca265317  /srv/fixture/source/older.txt
    88e41e59e2af6224419a18a2594352fe011e9cee9510d58c3f644d2cca265317  /srv/fixture/destination/older.txt
    e8f87a3d4fb00513b6a58cd46c6a3bbb71455b994cb9f5611108f51db312d9f0  /srv/fixture/source/missing.txt
    e8f87a3d4fb00513b6a58cd46c6a3bbb71455b994cb9f5611108f51db312d9f0  /srv/fixture/destination/missing.txt

    The newer source and destination hashes remain different, and the destination keeps its original 761517... hash. The older and missing source/destination pairs now match.