Como fazer diff imprimir um arquivo completo diff quando um arquivo não existe?

6

Estou tentando comparar arquivos no sistema de arquivos raiz com um backup, e gostaria que a comparação funcionasse um pouco como git ou svn diff quando um arquivo foi adicionado ou removido - Ou seja, exibe o arquivo completo diff . diff infelizmente apenas imprime uma mensagem No such file or directory , o que não é muito útil. Eu não consegui encontrar uma opção para isso.

A solução mais simples que consegui encontrar é analisar a diff output e diff -u path <(printf '') ou diff -u <(printf '') path dependendo do caminho existente. Isso é um pouco complicado - Provavelmente 10 linhas de código para o que poderia ser uma simples opção diff .

Outra solução alternativa é

diff -u <([ -e "$path1" ] && cat "$path1") <([ -e "$path2" ] && cat "$path2")

, mas que perde os nomes dos arquivos no diff.

Com base na resposta de Craig Sanders e na solução anterior, acabei com isso:

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

Editar : Acontece que é uma opção para isso:

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

Em outras palavras:

diff -Nu "$path1" "$path2"
    
por l0b0 04.09.2012 / 11:58

2 respostas

7

Com pelo menos algumas versões do diff do GNU diffutils, você pode usar o -N flag para fazer isso diretamente (embora a documentação pareça dizer que funciona apenas para diffs de diretórios).

$ 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.
    
por 04.09.2012 / 12:49
3

você tentou diff -u /dev/null filename ?

que funcionou para mim quando eu tentei.

alternativamente:

touch missing
diff -u missing filename
rm missing

Além disso, se você diferenciar diretórios (por exemplo, diff -x /path/to/backup -uN / /path/to/backup ), então o diff exibirá recursivamente os diffs completos de todos os arquivos, incluindo arquivos ausentes. Você precisa da opção -x, --exclude=PAT porque / path / to / backup é um subdir de /

(obrigado a Mat por me lembrar da opção -N)

    
por 04.09.2012 / 12:36

Tags