使用 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 '/$'
我在这里找到了几种关于如何完成此操作的方法,但我 运行 遇到了一个超出我 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 '/$'