递归地扩展目录,忽略所有二进制文件:

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删除二进制文件的行(以"二进制文件"开头),然后将其重定向到输出文件.

  • @Serg您可以使用`-x`标志排除文件.尝试`diff -r -x'*.xml'dir1 dir2`另外,`man diff`获取更多信息. (7认同)

小智 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)

  • 它是一个bash内部变量.在http://tldp.org/LDP/abs/html/internalvariables.html下查找IFS,了解其精确的定义和行为. (5认同)
  • 任何人都知道`IFS = $'\n'`的目的? (2认同)

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的合并工具合并它们.


Moh*_*aka 5

如果项目中二进制文件的名称像通常那样遵循特定模式(*.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)

  • @code_dweller 两者都存在:“-x”用于排除命令行上的模式,而“-X”表示包含所有要排除的模式的文件。 (2认同)