使用 diff 比较本地目录和远程目录的困难

Difficulties comparing local directory and remote directory using diff

我在这里找到了几种关于如何完成此操作的方法,但我 运行 遇到了一个超出我 linux 知识范围的问题。我想将本地文件夹与远程文件夹进行比较,如果它们不相同,则将 "alert" 写入文件,这将由我的 nagios 服务器进行检查,并让人们知道目录不同步。

情况。

我可以比较单个文件:

diff -w /data/telescopedata/40in/shd/2016/test <(ssh astro 'cat /data/40in/shd/2016/test')
0a1
> line 1

它成功returns区别所以ssh和数据路径都很好。

我可以这样列出远程目录:

ssh astro 'ls -l /data/40in/shd/2016'

现在,如果我尝试做同样的事情并比较我得到的目录:

diff -w /data/telescopedata/40in/shd/2016 <(ssh astro ls -l '/data/40in/shd/2016')

结果是:

diff: /data/telescopedata/40in/shd/2016/63: No such file or directory

/63 让我阅读了我认为我理解的命名管道和匿名管道。但是,我不确定如何使我的差异工作。我可以用 rsync 做到这一点,但我想看看我是否可以让它与 diff 一起工作。

谁能指引我正确的方向?

diff -w /data/telescopedata/40in/shd/2016 <(ssh astro ls -l '/data/40in/shd/2016')

这是胡说八道。你不能像这样比较目录。最简单的方法是使用 sshfs 在本地挂载您的远程目录并比较它们:

mkdir /tmp/cmp
sshfs astro:/data/40in/shd/2016 /mnt/cmp
diff -w /data/telescopedata/40in/shd/2016 /mnt/cmp/
fusermount -u /tmp/cmp

它应该能很好地完成工作。

sshfs 很酷,但我没有,所以这是另一种不涉及任何安装等的简单方法:

mkdir /tmp/cmp
scp -pr astro:/data/40in/shd/2016 /tmp/cmp
diff -rw /data/telescopedata/40in/shd/2016 /tmp/cmp/2016
rm -rf /tmp/cmp

通过网络复制整个目录树可能看起来很笨拙,但您在任何主机到主机比较中都以某种方式这样做(rsync 除外,但它不会显示实际差异).但是仍然存在写入磁盘的开销。如果您的文本文件很大,使用 scp -C 压缩选项可以加快处理速度。

顺便说一句,注意 diff 上的 -r。对两个目录进行简单比较只会比较这些目录的顶级内容,因此即使相应子目录的内容不同,也可能会报告它们相同。

比较本地和远程层次结构

rsync -arnv --exclude 'pdf/' --exclude 'libs/' --exclude '*.gz'  root@127.129.156.177:$PWD .  

有备用路径

rsync -arnv --exclude 'pdf/' --exclude 'libs/' --exclude '*.gz'  root@127.129.156.177:${PWD/html/release}/ . | grep -v '/$'