是否有像 diff 这样的 Linux 工具可以递归比较文件和目录,但还增加了比较:扩展属性、acl、se 上下文?
有没有办法将我对 vim 缓冲区所做的更改保存为原始文件的补丁文件,而无需将其保存为单独的文件并使用 diff?
git log -G<regex> -p是一个很好的工具,可以在代码库的历史记录中搜索与指定模式匹配的更改。然而,在几乎不相关的大块海洋中找到差异/补丁输出中的相关大块可能会让人不知所措。
当然可以搜索git log原始字符串/正则表达式的输出,但这对减少许多不相关更改的视觉噪音和干扰几乎没有作用。
继续阅读git log,我看到了--pickaxe-all,这与我想要的完全相反:它扩大了输出(到整个变更集),而我想限制它(到特定的大块)。
本质上,我正在寻找一种方法来“智能地”将差异/补丁解析为单个大块,然后对每个大块执行搜索(仅针对更改的行),丢弃不匹配的大块,并输出那些大块那做。
是否存在我描述的工具?有没有更好的方法来获得匹配/受影响的帅哥?
我做过的一些初步研究......
如果可以grep使用 diff/patch 输出并使上下文选项值动态化(例如,通过正则表达式而不是行数),那可能就足够了。但grep并非完全按照这种方式构建(我也不一定要求该功能)。
我找到了patchutils套件,最初听起来它可能适合我的需求。但是在阅读其man页面后,这些工具似乎无法处理基于正则表达式的匹配块。(不过,他们可以接受帅哥的名单……)
我终于遇到了splitpatch.rb,它似乎可以很好地处理补丁的解析,但它需要显着增强以通过 处理读取补丁stdin,匹配所需的大块,然后输出大块。
diff -u file1.txt file2.txt > patchfile
Run Code Online (Sandbox Code Playgroud)
创建一个补丁文件,其中包含patch将 file1.txt 转换为与 file2.txt 完全一样的指令
这不能使用cp命令来完成吗?我可以想象这在文件太大并且必须通过网络传输时很有用,这种方法可能会节省带宽。有没有其他方法可以使用 diff/patch 在其他场景中是有利的?
在工作中,我们每晚都会转储我们的 mysql 数据库。每天,我都会猜测接近 90-95% 的数据是重复的,并且随着时间的推移而增加。(哎呀,在这一点上,有些可能是 99%)
这些转储是一行是单个 mysql INSERT 语句的地方,因此唯一的区别是整行以及它们在文件中的顺序。如果我对它们进行排序,文件与文件之间的实际差异将非常小。
我一直在寻找,但我还没有找到任何方法来对转储输出进行排序。不过,我可以通过sort命令进行管道传输。然后会有很长很长的相同行块。
所以我试图找到一种只存储差异的方法。我可以从一个主转储开始,然后每天晚上进行比较。但是每晚差异都会更大。或者,我可以制作滚动差异,单个差异非常小,但如果我必须每晚将整个系列的主要差异放在一起,计算时间似乎会越来越长。
这可行吗?用什么工具?
编辑我不是问如何做 mysql 备份。暂时忘记mysql。这是一条红鲱鱼。我想知道的是如何从一系列文件中制作一系列滚动差异。每天晚上我们都会得到一个文件(恰好是一个 mysqldump 文件),它与之前的文件有 99% 的相似度。是的,我们对它们全部进行 gzip。但是首先拥有所有这些冗余是多余的。我真正需要的是与前一天晚上的差异……与前一天晚上的差异仅 1%……等等。所以我所追求的是如何制作一系列差异,所以我每晚只需要存储那 1%。
我正在试验ediff-directories,但我不确定我是否正确使用它。
我在文档中读到,一旦我向 提供了两个目录ediff-directories,如果我按下==Emacs 就会递归地比较它们。
但是,如果我按,==我只会=在我运行命令的级别上得到带有符号的文件夹(意味着这两个文件夹具有相同的内容)。如果我想查看文件=夹层次结构中哪些文件夹在更深层次上有标志,我需要==在每个级别重新运行命令。
我如何告诉 emacs 一直递归到叶子,以便我可以看到directory difference buffer(可通过键盘命令访问D)中的所有差异?
如果有人知道有关如何使用的教程ediff-directories(官方文档除外),我会非常感兴趣。
此外,如果我想退出会话组(在一个级别上比较文件夹),但我为更深层次打开了会话,如果我按下q(退出此会话组),Emacs 会抱怨以下消息:
此会话组有活动会话---无法退出
如何退出会话组而不一一退出子会话?
less根据这个线程,它本身不能进行语法高亮显示。
但是,git diff在它的默认寻呼机 less 中很好地显示了彩色输出。当我将 的输出重定向git diff到文件中时,看不到颜色转义序列。
是否git diff知道它被发送到哪里,并相应地格式化输出?那怎么办呢?
我只是注意到 git 为diff输出着色(例如git diff),但是,它通常不知道如何语法突出显示。例如
git show 415fec6:log.tex
Run Code Online (Sandbox Code Playgroud)
不启用任何类似 TeX 的语法。
阅读git资料,我发现以下提示
在diff.h:
int use_color;
Run Code Online (Sandbox Code Playgroud)
我以前指的是语法高亮,但那是不正确的。我的意思是输出着色,参见例如

我有一个大文件,由大表格形式的分号分隔的文本字段组成。它已经排序。我有一个由相同文本字段组成的较小文件。在某些时候,有人将此文件与其他文件连接起来,然后进行排序以形成上述大文件。我想从大文件中减去小文件的行(即对于小文件中的每一行,如果大文件中存在匹配的字符串,则删除大文件中的该行)。
该文件大致如下
GenericClass1; 1; 2; NA; 3; 4;
GenericClass1; 5; 6; NA; 7; 8;
GenericClass2; 1; 5; NA; 3; 8;
GenericClass2; 2; 6; NA; 4; 1;
Run Code Online (Sandbox Code Playgroud)
等等
有没有一种快速优雅的方法来做到这一点,还是我必须使用 awk?
我想从特定gcc分支创建一个补丁,将其与官方版本进行比较;因此,当我从稳定版本中解压缩 tarball 时,我可以应用补丁并获得与该特定分支中的内容相同的内容。
这是我第一次需要创建补丁,所以这是我第一次这样做,我主要关心的是获得正确的选项和解析,因为我们正在谈论一个非常重要的软件
diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch
Run Code Online (Sandbox Code Playgroud)
这是否足够并且是最好的方法?
我正在对一个非常大的文件图像文件(只有几个像素差异)进行微小更改,该文件需要很长时间才能通过网络传输。
有没有办法让 rsync 识别文件中的差异并只通过网络发送小的差异?