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

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

我正在尝试将根文件系统上的文件与备份进行比较,并且我希望比较的工作方式有点像gitsvn 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")

,但这会丢失差异中的文件名。

基于克雷格·桑德斯的回答和之前的解决方法,我最终得到了这个:

diff -u \
    "$([ -e "$path1" ] && echo "$path1" || echo /dev/null)" \
    "$([ -e "$path2" ] && echo "$path2" || echo /dev/null)"

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

-N, --new-file
       treat absent files as empty

换句话说:

diff -Nu "$path1" "$path2"

答案1

至少对于某些版本的 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.

答案2

你有没有尝试过diff -u /dev/null filename

当我刚尝试时这对我有用。

或者:

touch missing
diff -u missing filename
rm missing

另外,如果您比较目录(例如diff -x /path/to/backup -uN / /path/to/backup),则 diff 将递归显示所有文件的完整差异,包括丢失的文件。您需要该-x, --exclude=PAT选项,因为 /path/to/backup 是 / 的子目录

(感谢 Mat 提醒我 -N 选项)

相关内容