Zéy*_*hin 73 bash shell diff binaryfiles
在Fedora Constantine盒子上工作.我diff
递归地查看两个目录以检查源更改.由于项目的设置(在我自己参与所述项目之前!叹息),目录包含源和二进制文件,以及大型二进制数据集.虽然diffing最终可以在这些目录上运行,但如果我可以忽略二进制文件,则可能需要20秒.
据我了解,DIFF没有一个"忽略二进制文件"模式,但确实有一个忽略的参数,它会忽略正则表达式中的文件.我不知道在那里写什么来忽略二进制文件,无论扩展名如何.
我正在使用以下命令,但它不会忽略二进制文件.有谁知道如何修改此命令来执行此操作?
diff -rq dir1 dir2
Sha*_*ner 65
有点作弊,但这是我用过的:
diff -r dir1/ dir2/ | sed '/Binary\ files\ /d' >outputfile
Run Code Online (Sandbox Code Playgroud)
这递归地将dir1与dir2进行比较,sed删除二进制文件的行(以"二进制文件"开头),然后将其重定向到输出文件.
小智 32
也许使用grep -I
(相当于grep --binary-files=without-match
)作为过滤器来整理二进制文件.
dir1='folder-1'
dir2='folder-2'
IFS=$'\n'
for file in $(grep -Ilsr -m 1 '.' "$dir1"); do
diff -q "$file" "${file/${dir1}/${dir2}}"
done
Run Code Online (Sandbox Code Playgroud)
Rec*_*nic 11
我来到这个(旧)问题寻找类似的东西(遗留生产服务器上的配置文件与默认的apache安装相比).遵循@ fearlesstost在评论中的建议,git
足够轻巧和快速,它可能比任何上述建议更直接. 将 version1 复制到新目录.然后做:
git init
git add .
git commit -m 'Version 1'
Run Code Online (Sandbox Code Playgroud)
现在删除此目录中版本1的所有文件,并将版本2复制到目录中.现在做:
git add .
git commit -m 'Version 2'
git show
Run Code Online (Sandbox Code Playgroud)
这将向您展示第一次提交和第二次提交之间所有差异的Git版本.对于二进制文件,它只会说它们不同.或者,您可以为每个版本创建一个分支,并尝试使用git的合并工具合并它们.
如果项目中二进制文件的名称像通常那样遵循特定模式(*.o
, *.so
, ...),则可以将这些模式放入文件中并使用-X
(连字符 X)指定它。
我的内容 exclude_file
*.o
*.so
*.git
Run Code Online (Sandbox Code Playgroud)
命令:
diff -X exclude_file -r . other_tree > my_diff_file
Run Code Online (Sandbox Code Playgroud)
更新:
-x
可以用来代替-X
, 在命令行而不是在文件中指定排除模式:
diff -r -x *.o -x *.so -x *.git dir1 dir2
Run Code Online (Sandbox Code Playgroud)