我有一个需求,比如...我需要编写一个 shell 脚本,它将比较位于两个不同服务器(服务器 A 和服务器 B)中的两个目录,并列出发现的差异(如果发现)。理想情况下,两个服务器中的目录的文件名、计数、大小应该相同。因此,脚本应该找出差异(如果有)。有人能帮我吗?提前致谢,并致以最诚挚的问候,Prasenjit
答案1
我喜欢使用 rsync 来实现这个目的。
例如在 ServerA 上运行:
rsync -avnc --delete /path/to/dir/ serverB:/path/to/dir/
-c
如果不需要对文件进行校验和比较,则可以删除该开关。如果没有该开关,如果文件大小和时间戳相同,rsync 将假定它们是相同的。
请注意每条路径末尾的斜杠。
很重要:确保你有-n
开关,否则 rsync 将开始更改 ServerB 的内容
答案2
在 Linux 上执行此操作的一个简单方法是:
- 使用
find
或ls
列出每个目录中的所有文件,并将结果导入不同的日志文件。使用ls
更适合您的目的,因为它可以显示各种信息,包括权限、日期和大小。 - 使用类似的方法比较日志文件
diff
来识别任何差异。
希望这可以帮助您入门。
答案3
find
可以让你更好地控制比较的内容,因为你只打印你需要的信息。例如,如果你想根据文件的名称和大小来比较文件,而不是根据文件日期或所有者/组信息来比较文件,你可以这样做:
find . -printf "%p\t%s\n"
find
支持多种类型的文件信息。以下仅列举几种:
%g File’s group name, or numeric group ID if the group has
no name.
%G File’s numeric group ID.
%m File’s permission bits (in octal).
%M File’s permissions (in symbolic form, as for ls).
%n Number of hard links to file.
%t File’s last modification time in the format returned by
the C ‘ctime’ function.
也许最简单的方法是如果你能以这样的方式挂载这两个目录,你可以这样做:
diff <(cd dir1; find . -printf "%p\t%s\n"|sort) <(cd dir2; find . -printf "%p\t%s\n"|sort)
答案4
我建议树:
ssh ServerA "tree -s -f <directory>" > /tmp/out1 && ssh ServerB "tree -s -f <directory>" > /tmp/out2 && diff /tmp/out1 /tmp/out2