我是 unix 新手,在这里需要一些帮助。我在两个不同的服务器上有两个目录。两个目录都包含相同的文件。现在我想检查两个目录中的所有文件是否同步。如果文件不同步,那么我只想显示这些文件的名称。当目录在同一台服务器上时,我可以做到这一点。当目录存在于两台不同的服务器上时,无法弄清楚如何执行此操作。
eg:
server1 /abc/home/sample1/
server2 /abc/home/sample2/
在这里,我只想在不同步时显示文件名。
提前致谢
您可以使用带有-n
标志的 rsync 来确定文件是否同步,而无需实际进行同步。
例如,从server1:
rsync -n -avrc /abc/home/sample1/* server2:/abc/home/sample2/
这将打印在和-r
之间不同的所有文件的名称(递归,带有标志)server1:/abc/home/sample1/
server2:/abc/home/sample2/
rsync
使用参数说明
-n, --dry-run
- 执行不做任何更改的试运行
-a, --archive
- 存档模式;等于 -rlptgoD(无 -H、-A、-X)
-v, --verbose
- 增加详细程度
-r, --recursive
- 递归到目录
-c, --checksum
-根据校验和跳过,而不是 mod-time & size
在服务器 1 上:
cd /abc/home/sample1/ && diff --side-by-side --suppress-common-lines <(find . -type f|xargs stat --printf "%s\t%n\n"|sort -n) <(ssh server2 "cd /abc/home/sample2/ && find . -type f|xargs stat --printf \"%s\t%n\n\"|sort -n")
这相当快,但可能不如 rsync 准确,因为它使用文件大小而不是内容的哈希值。此外,如果 server2 的文件比 server1 多,则 kielni 的答案中的 rsync 不会显示任何内容。而是试试这个:
rsync -n -avr --size-only --delete /abc/home/sample1/ server2:/abc/home/sample2/
我总是rsync -avcn
用于此类任务 - 我是 CLI 粉丝。这个想法是做一个“试运行”(-n
),它显示了在没有实际复制任何文件或进行任何更改的情况下会做什么。使用-c
开关非常重要,因为它使用校验和而不是修改日期或文件大小来确定文件是否不同。-a
确保比较更彻底,并迫使程序深入到子目录中。最后,-v
增加详细程度,这在找到不同文件的情况下很有用。
所以一个可能的解决方案是这样的:
rsync -avcn source_dir/ dest_dir/
并将rsync
打印两个目录之间不同的文件的名称。注意尾部的斜杠 - 它们是必不可少的。
然而:
rsync -avcn source_dir/ dest_dir/ > diffs.txt
rsync -avcn /src/My Dir/ dest/My dir/
不是你想要的;相反,您应该使用rsync -avcn /src/My\ Dir/ dest/My\ Dir/
or rsync -avcn /src/"My Dir"/ dest/"My Dir"/
。这一点在处理 Windows 挂载时尤其有效。在两台服务器之间没有连接的情况下,使用“tree”命令获取文件中的目录结构,然后比较两个文件。