如何比较目录之间的差异(Linux)


24

我有两个目录-一个来自早期备份,第二个来自最新备份。如何比较Linux上最新备份对目录中文件的更改?另外,我如何显示例如文本和php文件中的更改-我正在考虑类似Wikipedia上的修订历史记录,您会在屏幕的一侧看到旧版本,而在另一侧看到最新版本,并突出显示更改。我如何实现这样的目标?

编辑:我还如何将远程目录与本地进行比较?

Answers:


35

从差异手册页:

如果from-file和to-file都是目录,则diff按字母顺序比较两个目录中的相应文件;除非给出-r或--recursive选项,否则此比较不是递归的。diff绝不会将目录的实际内容像文件一样进行比较。完全指定的文件可能不是标准输入,因为标准输入是无名的,并且“具有相同名称的文件”的概念不适用。

因此,比较目录: diff --brief -r dir1 dir2

并排比较文件: diff --side-by-side file1 file2


非常酷,我来试试看
Phil

...我不知道如何将远程目录与本地目录进行比较?
Phil

1
您将必须将远程目录安装到本地计算机。但是,您可以像这样远程比较文件:ssh REMOTE_SERVER“ cat / path / to / some / file” | diff --side-by-side / path-to-some-file-另一件事,如果要保存某些键入内容,“ sdiff”命令的作用类似于“ diff --side-by-side”。
肖恩·斯塔斯

2
使用NFS挂载远程目录。在远程服务器(server-b)上,编辑/ etc / exports并将以下内容放入其中:/ path / of / directory / to / share server-a.ip.address(ro,no_root_squash)在server-b上启动NFS (/etc/init.d/nfs start)通过将以下内容添加到/ etc / fstab来安装到本地服务器(server-a):server-b.ip.add:/ path / of / directory / to / share / mnt / server-b nfs rsize = 32768,wsize = 32768,rw 0 0然后在服务器a上,mkdir / mnt / server-b; mount / mnt / server-b感谢您的支持。
肖恩·斯塔斯

2
您可以sshfs用来创建临时的临时网络目录,而不必使用NFS。
Dan Andreatta 2010年

3

假设:

  • 我们在www1,与远程www2
  • 从本地www1到远程都有公共密钥身份验证www2
  • 我们比较本地www1和远程用户www2
找到/ var / www / html / -name“ *” -exec md5sum -b {} \; | grep -v“ / var / www / html / exclude_this dir”> local.md5
ssh www2“查找/ var / www / html / -name'*'-exec md5sum -b {} \; | grep -v / var / www / html / exclude_this目录> remote.md5”
scp www2:remote.md5。
diff local.md5 remote.md5 

3

您确实想将rsync减少带宽消耗的能力与带来强大,diff灵活的差异的能力相结合。

所以像这样:

cp -R $local $bak
rsync $server:$remdir/* $local/
rsync $local/ $server:$remdir/* 
diff -wur $local $bak

我想如果您经常使用它rsync而不是cp在第一行中进行调整,则可以对它进行一些调整-显然,在最后一行中,您可以根据diff自己的喜好完全格式化它。在OP的情况下可能为y

这种方法的缺点是您最终会使用两倍的本地空间,但是花费不到$ 1 / g谁在乎?


cp --reflink=auto --sparse=always根据基础FS,不使用任何空间进行复制。
汤姆·黑尔

1

不要diff old_dir new_dir > diff.txt用同一台服务器上侧边差的一面。

对于远程文件:

例如:ABC是现有服务器,XYZ是您的远程服务器,目录名称是123。

步骤1:将ABC服务器上的现有目录123重命名为123_ABC。

ABC:/Home > mv 123 123_ABC

步骤2:在服务器ABC上创建一个新目录:

ABC: > mkdir 123_XYZ

步骤3:将所有文件从XYZ服务器上的目录123复制到ABC服务器上的123_XYZ目录:

XYZ/123 > scp * userid@ABC: /123_XYZ

这会将所有文件从XYZ服务器上的目录复制到ABC服务器/ 123_XYZ目录。

步骤4:在两个目录之间进行比较:

现在转到ABC服务器并在123_ABC和123_XYZ之间执行比较

ABC > diff 123_ABC 123_XYZ > diff.txt

上面的命令会将差异结果保存到同一路径中的diff.txt中。

然后,您可以比较差异。

谢谢,

h


0

AIDE高级入侵检测环境(AIDE)是用于UNIX操作系统的文件完整性检查器。其目的是提供有关受支持文件系统上数据完整性的报告。通过在目标主机上多次运行AIDE,您可以确定正在更改的文件。通过在不同主机上多次运行AIDE,可以确定哪些文件和权限不同。然后在报告的“不同”文件上使用gui diff工具。

或使用gui diff工具,例如meld,guiffy,kdiff3,diff,vimdiff,gvimdiff,Emacs,Kompare,Diffuse,Easydiff,TkDiff或xxdiff。除文件差异外,大多数将执行目录差异。如其他人所述,您需要使用NFS,SMBFS或SSHFS挂载远程驱动器。


0

或者,您可以将两个文件与文件列表一起使用。然后比较这两个文件。例如:

/path/to/compare/remote$: ls > remote-files 

/path/to/compare/local$: ls > local-files 

下载其中一个文件。

-rw-r--r-- 1 1015 1015 26624 2005-06-14 13:10 FILE.TXT  

到FILE.TXT

使用diff(diff -y remote-files local-files > diff-files)进行比较。打开差异文件并进行检查。每行带有>表示一个不同的文件。

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.