我最初的问题:
rsync 命令的选项有什么--dry-run
作用?在我当前工作的网络上,它似乎会生成一个非常长的文件列表,这没什么用。
以下是更多细节:
我最近(终于)开始在 TrueNAS 盒子上部署 Samba 共享。必须是 Samba,因为我同时使用 Linux、Windows 和偶尔的 OS X 系统,所以我想要一个联网存储位置,如果需要,我可以从这三个系统使用它。
我现在正在努力将数据从随机硬盘阵列移动到 TrueNAS 系统上的存储池。我发现最简单的方法是使用 TrueNAS 系统上的 rsync 服务器,然后使用客户端上的 rsync 发送数据。
我正在复制数据的某些驱动器有多个相同目录名称的副本。但我不能保证它们是相同的,因为其中一些是在后来制作的。
警告:我不能依赖文件的时间戳。原因:在开始数据迁移之前,我将大量内容移至单个磁盘。
例如:我有一个 3TB 的磁盘,其中包含以下内容
Documents-backup/...
Documents-backup_2/... # same directory structure as Documents-backup,
# may or may not be identical
然后另一个驱动器包含
Documents-backup/... # may or may not be identical to dir on another disk
其中一些文件夹的大小很大,内容超过 100 GB。
我想要做的就是使用 rsync 来:
- 首先检查(使用试运行和校验?)文件夹是否相同。如果相同,我可以丢弃/删除其中一个,无需复制它并在 NAS 上保留 2 个副本
- 如果不相同,则给出具有不同校验和的文件列表
我认为以下命令可以做到这一点:
rsync -a -c --progress --dry-run ./local-path user@ipaddress::rsyncservername/remote-path
然而据我所知,所有这些都只是打印正在检查的所有文件的列表,而不是具有不同校验和的文件的列表。
研究/部分答案?
我通过搜索找到了这个问题rsync dry-run
。这个问题提到了不同的权限。由于我使用了存档开关-a
,我认为这可以保留权限。我的猜测是 samba 不支持 Linux 权限,这导致 rsync 认为文件之间存在“差异”,尽管校验和相同。
在备份 Linux 主文件夹时,对 rsync dry-run 中的变化进行更有意义的回顾
所以我的问题稍微狭窄一些,但本质上还是一样。考虑到我的限制(服务器必须是 samba),我该如何执行 rsync 来使用校验和检查文件之间的差异?
答案1
rsync 命令的 --dry-run 选项有什么作用?
正如它man rsync
所说的,
这会使 rsync 执行试运行,不会进行任何更改(并且产生的输出与实际运行大致相同)。它最常与
-v
、--verbose
和/或-i
选项结合使用--itemize-changes
,以便在实际运行 rsync 命令之前查看它要执行的操作。
您建议的命令将运行得非常非常慢,因为它必须禁用其优化的很大一部分,而是对每个文件进行校验和。我注意到您警告过您之前省略了时间戳,实际上您应该使用校验和来验证初始数据。复制完时间戳后,您应该从未来的同步运行中删除-c
( ) 标志。--checksum
您可能需要的是--itemize-changes
( -i
) 标志,它向您显示每个文件需要更改的内容。--dry-run
( -n
) 标志将报告每个文件需要更改 - 即使唯一需要更改的部分是元数据(例如文件修改时间)。您可能还需要考虑--delete
识别应从目标中删除的文件,因为它们不再存在于源中。
考虑以下示例场景
date >origfile # Original file
sleep 65
cp origfile copyfile # Same content, different timestamp
cp -p origfile samefile # Same content, same timestamp
date >difffile # Different content, different timestamp
ls -l ????file
-rw-r--r-- 1 roaima roaima 29 May 21 17:03 copyfile
-rw-r--r-- 1 roaima roaima 29 May 21 17:03 difffile
-rw-r--r-- 1 roaima roaima 29 May 21 17:01 origfile
-rw-r--r-- 1 roaima roaima 29 May 21 17:01 samefile
# Only use --no-whole-file for this scenario. DO NOT use it in production code
for file in {copy,diff,same}file
do
echo "== $file =="
rsync --dry-run -ai --delete --no-whole-file --checksum origfile "$file"
echo
done
输出(分阶段)
copyfile
需要更新(时间戳)== copyfile == >f..t...... origfile
difffile
需要更新(内容和时间戳)== difffile == >fc.t...... origfile
samefile
不需要更新(没有输出rsync
)== samefile ==