我正在尝试将根文件系统上的文件与备份进行比较,并且我希望比较的工作方式有点像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")
,但这会丢失差异中的文件名。
基于克雷格·桑德斯的回答和之前的解决方法,我最终得到了这个:
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 选项)