比较(差异)完整目录结构的最佳方法?


29

比较目录结构的最佳方法是什么?

我有一个使用rsync的备份实用程序。我想告诉您源文件和备份文件之间的确切差异(在文件大小和最后更改的日期方面)。

就像是:

Local file                   Remote file                         Compare
/home/udi/1.txt (date)(size)   /home/udi/1.txt (date)(size)     EQUAL
/home/udi/2.txt (date)(size)   /home/udi/2.txt (date)(size)     DIFFERENT

当然,该工具可以是现成的,也可以是关于python脚本的想法。

非常感谢!

乌迪

Answers:


18

您寻找的工具是rdiff。它就像结合rsync和diff一样工作。它会创建一个补丁文件,您可以对其进行比较或分发。


9

有些人出于不同的原因想要比较文件系统,因此我将在此处写下我想要的内容以及如何做到的。

我想了:

  • 要将同一文件系统与其自身进行比较,即快照进行更改快照比较
  • 添加或删除哪些文件的列表,与内部文件更改无关。

我做了什么:

第一个快照(before.sh脚本):

find / -xdev | sort > fs-before.txt

第二张快照(after.sh脚本):

find / -xdev | sort > fs-after.txt

要比较它们(diff.sh脚本):

diff -daU 0 fs-before.txt fs-after.txt | grep -vE '^(@@|\+\+\+|---)'

好消息是,这使用了很多默认的系统二进制文件。根据内容进行比较可以通过传递回显文件路径find-exec参数以及此后的MD5来完成。


8

如果您不想安装其他工具...

for host in host1 host2
do
  ssh $host ' 
  cd /dir &&
  find . |
  while
    read line
  do
    ls -l "$line"
  done ' | sort  > /tmp/temp.$host.$$
done
diff /tmp/temp.*.$$ | less
echo "don't forget to clean up the temp files!"

是的,可以使用find和exec或find和xargs来完成,就像在for循环中一样容易。而且,您还可以调整diff的输出,使其显示诸如“此文件位于host1而不位于host2上”之类的信息,但在那时,您最好只安装其他人都在谈论的工具...


5

我过去使用dirdiff来比较目录结构。它仅适用于本地目录,因此您必须sshfs-mount其他目录。

好处是,您可以直观地看到文件是否相等以及哪个是新的还是旧的。它最多支持5个目录。您还可以查看差异并将文件从一个复制到另一个。


4

从rsync手册页:

-n, --dry-run
This  makes rsync perform a trial run that doesn’t make any changes (and produces mostly
the same output as a real run).  It is most commonly used in combination  with  the  -v,
--verbose  and/or -i, --itemize-changes options to see what an rsync command is going to
do before one actually runs it.

可能会有所帮助。


谢谢,但是这并不能解决我的问题(我正在寻找差异以实际分辨出差异)。
亚当·马坦

4

diff -r实际上效果很好。如果您只是想知道文件是否有所不同,而不是实际的内容,那么请执行diff -qr


1
-r意味着递归,它不连接到远程主机!
迈克尔·汉普顿

3

我会为此使用Meld。


如果您需要GUI解决方案,Meld为此非常好用。
Drew Noakes

2

除了Windows上已经提到的工具之外,您还可以使用Total Commander或WinSCP,它们都具有非常舒适的功能来比较(和同步)目录。


0

我并不是真的想安装任何新东西,所以我的解决方案有点粗糙,但是又快速又有效。

我想比较所有已复制的文件,它们的文件模式,所有权和SELinux安全性上下文保持不变。

所以我跑了:

rsync -aX /orig /copy/

然后像这样比较:

cd /orig && ls -lZR > /tmp/diff_orig
cd /copy && ls -lZR > /tmp/diff_copy
vimdiff /tmp/diff_*

如果两个文件的内容均保持折叠状态,则它们是相同的。如果不是,则显示差异。

更新的参数ls以反映您需要检查的属性。青年汽车

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.