
ルートファイルシステムのファイルをバックアップと比較しようとしていますが、ファイルが削除された場合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のファイル名を失います。
に基づいてクレイグ・サンダースの回答以前の回避策を使用すると、次のようになります。
diff -u \
"$([ -e "$path1" ] && echo "$path1" || echo /dev/null)" \
"$([ -e "$path2" ] && echo "$path2" || echo /dev/null)"
編集する:あることがわかりました。はいオプションの1つ:
-N, --new-file
treat absent files as empty
言い換えれば:
diff -Nu "$path1" "$path2"
答え1
少なくとも、GNU diffutilsの一部のバージョンでは、このフラグを使用して直接これを行うdiff
ことができます-N
(文書ではディレクトリdiffに対してのみ機能することを示していますが)。
$ 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は欠落しているファイルを含むすべてのファイルの完全なdiffを繰り返し表示します。-x, --exclude=PAT
/path/to/backup は / のサブディレクトリなので、このオプションが必要です。
(-Nオプションについて思い出させてくれたMatに感謝します)