我最初的问题:

我最初的问题:

我最初的问题:

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

输出(分阶段)

  1. copyfile需要更新(时间戳)

     == copyfile ==
     >f..t...... origfile
    
  2. difffile需要更新(内容和时间戳)

     == difffile ==
     >fc.t...... origfile
    
  3. samefile不需要更新(没有输出rsync

     == samefile ==
    

相关内容