我在本地和服务器上都有一个文件。我首先尝试rsync在“dry-run”模式下运行,看看文件之间是否存在一些差异:
$ rsync -aP --dry-run USER@192.168.0.55:/home/dir .
USER@192.168.0.55's password:
receiving incremental file list
dir/myfile.txt
Run Code Online (Sandbox Code Playgroud)
这显然意味着该文件dir/myfile.txt不同,因为它将被更新。然后我用以下命令检查相同的文件diff:
$ ssh USER@192.168.0.55 'cat /home/dir/myfile.txt' | diff --report-identical-files - dir/myfile.txt
USER@192.168.0.55's password:
Files - and dir/myfile.txt are identical
Run Code Online (Sandbox Code Playgroud)
因此,显然这些文件是相同的。
为什么rsync要更新这个文件 - 我如何从命令行确认原因?
我有一个学校的任务。其中一部分是检查文件的更改并将这些更改写入日志文件。到目前为止,我已经找到了diff在我看来可能有帮助的命令。假设我有两个文件,内容如下:
文件 1
orange
apple
Run Code Online (Sandbox Code Playgroud)
文件 2
orange
apple
strawberry
Run Code Online (Sandbox Code Playgroud)
如果我diff -c file1 file2在这种情况下使用,命令的输出是
*** file1 2016-11-24 08:31:19.424712242 +0100
--- file2 2016-11-24 08:25:24.604681751 +0100
***************
*** 1,2 ****
--- 1,3 ----
orange
apple
+ strawberry
Run Code Online (Sandbox Code Playgroud)
我认为这意味着需要将带有“+”符号的行添加到 file1 中才能使它们相同(?)。
现在假设我将 file1 更改为:
orange
apple
peach
Run Code Online (Sandbox Code Playgroud)
的输出diff -c file1 file2是:
*** file1 2016-11-24 08:34:50.647128312 +0100
--- file2 2016-11-24 08:25:24.604681751 +0100
***************
*** 1,3 ****
orange
apple
! peach
--- 1,3 ----
orange
apple
! strawberry
Run Code Online (Sandbox Code Playgroud)
在这里我迷路了,因为我不明白这些感叹号是什么意思。突然之间,diff …
我正在使用比较两个目录的内容diff。
它在多线程系统上仅使用一个线程。有人知道一种必须diff使用多个 cpu/线程的方法吗?parallel也许使用?
所以我们都diff默认安装了命令。我当然不知道如何很好地使用它。但我希望有一些合理的默认用法。但是当我打字时,diff file1 file2我得到了……一个文本……我必须在脑子里解析……这无济于事,因为这是两个文本的奇怪组合,而这两个文本本身又非常复杂。
所以我寻找了一个图形解决方案,例如meld. 开箱即用的效果要好得多。
然而,我更愿意一直保持在命令行上。是否有一个相当标准的命令:
libncursesvim,emacs也不依赖于IDE如果没有,为什么不呢?我看了看,colordiff但它并没有完全削减它。
可以patch幂等地调用;即,是否存在某些选项组合会导致重复调用patch与单次调用patch(对于非空差异)具有相同的效果?
取差异时,复制上下文输出格式和统一上下文输出格式有什么区别?
diff -NBur dir1/ dir2/
diff -NBcr dir1/ dir2/
Run Code Online (Sandbox Code Playgroud) 有没有办法可以将 gzip 压缩的 tarball 与现有目录进行比较?
我希望能够在不从 tarball 中提取数据的情况下做到这一点。
旧的diff、patch和merge程序及其现代派生的版本控制系统非常适合管理可以由多人同时编辑的源代码。
然而,它们是严格面向行的,因此往往会落在更自由形式的文本上。在我的特殊情况下,我正在处理latex由多人编辑的文件,并且文本不断重排——在段落中添加或减去一个词会改变段落其余部分的行边界。有一些diff工具可以突出显示一行中的更改(许多现代 GUI 工具),甚至处理重排文本(wdiff, git diff --word-diff)。但是,我没有发现任何可以处理三向合并或修补的东西。
有谁知道一个可以自动执行此操作的好工具?(是的,我可以将文本切碎,以便将每个单词(和一行空白)放在单独的行上。像 for 的格式这样的东西git diff --word-diff=porcelain可能不是一个糟糕的选择。但要使这种可逆和强大的自动合并(包括合并冲突标记)并不是很简单)。
git合并驱动程序的奖励积分。
您知道当您使用 man 命令阅读手册(例如man ls)并获得分页的输出时,您可以通过按“f”进一步向下阅读和“b”进一步阅读来从上到下阅读(假设您是从上到下从左到右阅读),然后按“q”退出。我希望 diff 的输出以相同的方式运行,因为有时我要阅读一长串差异,但我发现自己必须在终端中一直向上滚动才能阅读输出的开头。
Git diff 命令执行此操作,我开始喜欢它(例如git diff),但我并不总是能够将所有文件置于版本控制之下。
我能想到的最好的方法是将 diff 命令的输出通过管道传输到其他一些命令,但我不确定是哪个。任何人都可以帮忙吗?提供的这种输出行为(如手册页)是否有名称供将来参考?
我试图用备份来比较根文件系统上的文件,我想比较的工作有点像git或者svn diff当一个文件被添加或删除-也就是说,显示完整的文件差异。diff不幸的是只是打印一条No such file or directory消息,这不是很有用。我找不到这个选项。
我能找到的最简单的解决方法是解析diff输出和/diff -u path <(printf '')或diff -u <(printf '') path取决于存在的路径。这有点麻烦 - 可能是一个简单的diff选项,可能只有 10 行代码。
另一个解决方法是
diff -u <([ -e "$path1" ] && cat "$path1") <([ -e "$path2" ] && cat "$path2")
Run Code Online (Sandbox Code Playgroud)
,但这会丢失差异中的文件名。
基于Craig Sanders 的回答和之前的解决方法,我最终得到了这个:
diff -u \
"$([ -e "$path1" ] && echo "$path1" || echo /dev/null)" \
"$([ -e "$path2" ] …Run Code Online (Sandbox Code Playgroud) diff ×10
patch ×2
command-line ×1
gnu-parallel ×1
gzip ×1
linux ×1
man ×1
merge ×1
ncurses ×1
programming ×1
rsync ×1
software-rec ×1
tar ×1