当文件不存在时,如何使差异打印完整的文件差异?

l0b*_*0b0 6 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" ] && echo "$path2" || echo /dev/null)"
Run Code Online (Sandbox Code Playgroud)

编辑:原来有它的一个选项:

-N, --new-file
       treat absent files as empty
Run Code Online (Sandbox Code Playgroud)

换句话说:

diff -Nu "$path1" "$path2"
Run Code Online (Sandbox Code Playgroud)

Mat*_*Mat 8

至少对于某些版本的 GNU diffutils' diff,您可以使用该-N标志直接执行此操作(尽管文档似乎说仅适用于目录差异)。

$ ls
foo
$ cat foo
foo
$ diff -u foo bar
diff: bar: No such file or directory
$ diff -uN bar foo
--- bar 1970-01-01 01:00:00.000000000 +0100
+++ foo 2012-09-04 12:45:34.000000000 +0200
@@ -0,0 +1 @@
+foo
$ diff -uN foo bar
--- foo 2012-09-04 12:45:34.000000000 +0200
+++ bar 1970-01-01 01:00:00.000000000 +0100
@@ -1 +0,0 @@
-foo
$ diff -v
diff (GNU diffutils) 2.8.1
Copyright (C) 2002 Free Software Foundation, Inc.
Run Code Online (Sandbox Code Playgroud)