差分目录,忽略所有二进制文件:

在Fedora Constantine盒子上工作。 我正在寻找diff两个目录recursion检查源变化。 由于该项目的设置(在我自己参与上述项目之前),目录包含源代码和二进制文件,以及大型二进制数据集。 虽然差异最终在这些目录上工作,但如果我可以忽略二进制文件,则可能需要20秒。

据我了解,差异没有“忽略二进制文件”模式,但有一个忽略参数,将忽略文件的正则expression式。 我不知道要写什么来忽略二进制文件,不pipe扩展名。

我正在使用以下命令,但不会忽略二进制文件。 有谁知道如何修改这个命令来做到这一点?

diff -rq dir1 dir2

也许使用grep -I (相当于grep --binary-files=without-match )作为筛选二进制文件的filter。

 dir1='folder-1' dir2='folder-2' IFS=$'\n' for file in $(grep -Ilsr -m 1 '.' "$dir1"); do diff -q "$file" "${file/${dir1}/${dir2}}" done 

有点作弊,但这里是我用的:

 diff -r dir1/ dir2/ | sed '/Binary\ files\ /d' >outputfile 

这将recursion地比较dir1和dir2,sed删除二进制文件的行(以“Binary files”开头),然后redirect到输出文件。

我来到这个(旧)问题寻找类似的东西(configuration文件在传统的生产服务器相比,默认的Apache安装)。 在评论中@ fearlesstost的build议之后, git足够轻量且快速,可能比上述任何build议都更直接。 版本1 复制到新目录。 然后做:

 git init git add . git commit -m 'Version 1' 

现在删除该目录中版本1的所有文件,并将版本2复制到目录中。 现在做:

 git add . git commit -m 'Version 2' git show 

这会向你展示第一次提交和第二次提交之间所有差异的Git版本。 对于二进制文件,只会说它们不同。 或者,您可以为每个版本创build一个分支,并尝试使用git的合并工具合并它们。

使用findfile命令的组合。 这要求你对目录中的file命令的输出进行一些研究; 下面我假设你想diff的文件被报告为ascii。 或者,使用grep -v过滤掉二进制文件。

 #!/bin/bash dir1=/path/to/first/folder dir2=/path/to/second/folder cd $dir1 files=$(find . -type f -print | xargs file | grep ASCII | cut -d: -f1) for i in $files; do echo diffing $i ---- $dir2/$i diff -q $i $dir2/$i done 

既然你可能知道巨大的二进制文件的名字,把它们放在一个哈希数组中,只有当文件不在哈希中时才做差异,就像这样:

 #!/bin/bash dir1=/path/to/first/directory dir2=/path/to/second/directory content_dir1=$(mktemp) content_dir2=$(mktemp) $(cd $dir1 && find . -type f -print > $content_dir1) $(cd $dir2 && find . -type f -print > $content_dir2) echo Files that only exist in one of the paths echo ----------------------------------------- diff $content_dir1 $content_dir2 #Files 2 Ignore declare -A F2I F2I=( [sqlite3]=1 [binfile2]=1 ) while read f; do b=$(basename $f) if ! [[ ${F2I[$b]} ]]; then diff $dir1/$f $dir2/$f fi done < $content_dir1 

那么,作为一种粗略的检查,你可以忽略匹配/ \ 0 /的文件。

如果项目中的二进制文件的名称按照特定的模式(* .o,* .so,…)进行,那么可以将这些模式放在一个文件中,并使用-X(连字符X )。

我的“排除文件”* .o * .so * .git的内容

 diff -X exclude_file -r . other_tree > my_diff_file