The -t option in rsync preserves modification times and does not negate the --compare-dest flag. Instead, these options serve complementary roles: --compare-dest determines which files are selected for transfer by comparing against a reference directory, while -t ensures that the timestamps of copied files match those in the source. They operate on different stages of the synchronization process.
Understanding rsync Comparison Logic
To understand why -t does not interfere with --compare-dest, it is necessary to look at how rsync decides whether a file needs to be updated. By default, rsync uses a combination of file size and modification time to determine if a file has changed. This is known as the "quick check" algorithm. If the sizes and times match, rsync assumes the file is identical and skips it. However, this heuristic can fail if two files have the same name, size, and timestamp but different content.
The --compare-dest option changes this behavior fundamentally. When you specify a compare destination directory, rsync compares the files in the source directory against the corresponding files in the compare destination directory, rather than against the actual destination directory. This is particularly useful for creating incremental backups or checking what would change without actually writing to the final target. The comparison logic here relies on the same quick check (size and time) unless you explicitly request a deeper check.
The Role of Modification Time (-t)
The -t flag stands for "preserve modification times." When you use this option, rsync attempts to restore the modification timestamps of the transferred files to match those of the source files. This is crucial for maintaining accurate backup histories and ensuring that tools relying on file timestamps (like make or specific deployment scripts) behave correctly.
It is important to note that -t affects the action taken after a file is deemed necessary for transfer. It does not influence the decision of whether to transfer the file. Therefore, it cannot negate the selection criteria established by --compare-dest. Even if you preserve timestamps, rsync still needs to know if the file content differs from the reference point before it copies anything.
Why Users Confuse These Options
Confusion often arises because both options involve timestamps. Users might assume that preserving timestamps (-t) somehow resets the comparison baseline, making the compare destination irrelevant. In reality, the comparison happens first. rsync checks if Source File A is different from Compare Destination File A. If they differ, the file is marked for transfer. Then, during the transfer phase, -t ensures that the copied file retains the original timestamp from the source.
This separation of concerns allows for complex synchronization strategies. For example, you can use --compare-dest to create a snapshot of changes since a previous backup, and then use -t to ensure that the new backup accurately reflects the state of the source data at the time of the copy.
Combining Options Effectively
When using --compare-dest alongside -t, you should expect the following workflow:
- Comparison Phase:
rsynciterates through the source directory. For each file, it looks at the corresponding path in the--compare-destdirectory. It compares size and modification time. - Decision Phase: If the file in the source is newer or different in size compared to the compare destination, it is queued for transfer. If it matches, it is skipped.
- Transfer Phase: Queued files are copied to the actual destination. During this copy, if
-tis specified, the destination file's timestamp is updated to match the source file's timestamp.
This sequence ensures that your destination directory is an exact mirror of the source, including metadata, while allowing you to verify changes against a stable reference point.
Deepening the Comparison
If you are concerned about false negatives in the comparison step (where files have the same size and time but different content), you can add the --checksum option. This forces rsync to compute a hash of the file contents during the comparison phase. While slower, this guarantees accuracy. Note that --checksum interacts with --compare-dest by performing the hash check against the compare destination files, not the actual destination. This is often used in conjunction with -t for critical data integrity scenarios.
For more information on managing file inclusion and exclusion patterns that might affect which files are considered during this comparison, see Can't Get Rsync to Exclude Specific Directories? Here's the Include Option to Try.
Practical Example
Consider a scenario where you want to back up a website directory to a backup drive, but only include files that have changed since the last backup stored in a separate "reference" folder. You would run a command similar to:
rsync -av --compare-dest=/path/to/reference /source/site/ /backup/directory/
If you add -t:
rsync -avt --compare-dest=/path/to/reference /source/site/ /backup/directory/
The output will show files being transferred only if they differ from the reference. The transferred files in /backup/directory/ will have their timestamps updated to match /source/site/. The reference directory remains untouched and serves solely as the comparison benchmark.
If you need to verify that your destination has enough space before committing to the transfer, especially when dealing with large datasets, consider running a dry run first. You can find guidance on checking available space in our article Determining If Enough Space is Available in Destination Drive for rsync Dry Run.
Frequently Asked Questions
Does -t make rsync ignore file content?
No, -t only affects how timestamps are handled after a file is selected for transfer. It does not skip content checks. The decision to transfer is still based on size and time comparisons (or checksums if enabled).
Can I use --compare-dest with multiple directories?
You can specify multiple --compare-dest options in a single command. rsync will check each one in order. If a file exists and matches in any of the compare destinations, it will be skipped. This is useful for layered backup strategies.
What is the difference between --link-dest and --compare-dest?
--link-dest creates hard links to existing files in the reference directory instead of copying them, saving space. --compare-dest only uses the reference for comparison decisions but still copies files to the destination. They can be combined for efficient incremental backups.
Will -t cause issues if the destination filesystem doesn't support timestamps?
Some network filesystems or older FAT partitions may not support precise timestamps. In such cases, rsync might log warnings about failing to set times. The transfer will usually succeed, but the timestamps will remain as the current system time or be lost entirely.
How do I debug why rsync thinks files are identical when they aren't?
Use the --verbose flag to see detailed logs. If you suspect content differences are being missed, add --checksum to force a full content comparison. Also, ensure that the timezone settings on both source and destination machines are consistent to avoid timestamp discrepancies.