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

时间:2016-05-23 07:33:37

标签: ssh diff

我在这里找到了几个关于如何实现这个目标的方法,但是我遇到了一个超出我的linux知识的问题。我想将一个本地文件夹与一个远程文件夹进行比较,如果它们与我的nagios服务器不同,那就写一个文件的“alert”,让人们知道这些目录是不同步的。

情况。

我可以区分单个文件:

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

它成功地返回差异,因此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。

有人能引导我朝着正确的方向前进吗?

3 个答案:

答案 0 :(得分:0)

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

它应该做得很好。

答案 1 :(得分:0)

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压缩选项可以加快速度。

顺便说一下,注意差异上的-r。在两个目录上执行普通差异仅比较这些目录的顶级内容,因此即使相应子目录的内容不同,也可以报告它们是相同的。

答案 2 :(得分:0)

比较本地和远程层次结构

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 '/$'