파일이 존재하지 않을 때 diff가 전체 파일 diff를 인쇄하도록 만드는 방법은 무엇입니까?

파일이 존재하지 않을 때 diff가 전체 파일 diff를 인쇄하도록 만드는 방법은 무엇입니까?

루트 파일 시스템의 파일을 백업과 비교하려고 하는데 파일이 삭제된 경우 git와 비슷하게 비교가 이루어지길 원합니다.svn diff추가 또는 제거- 즉시 표시전체 파일 비교. diff불행히도 No such file or directory메시지만 인쇄되므로 그다지 유용하지 않습니다. 이 옵션을 찾을 수 없습니다.

내가 찾을 수 있는 가장 간단한 해결책은 diff출력을 구문 분석 diff -u path <(printf '')하거나 diff -u <(printf '') path존재하는 경로에 의존하는 것입니다. 이는 약간의 패치워크입니다. diff10줄의 코드가 필요한 간단한 옵션일 수 있습니다.

또 다른 해결책은

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)"

편집하다: 있다는 사실이 밝혀졌습니다.옵션 중 하나:

-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에게 감사드립니다)

관련 정보