¿Cómo hacer que diff imprima un file completo diff cuando un file no existe?

Estoy tratando de comparar files en el sistema de files raíz con una copy de security, y me gustaría que la comparación funcione un poco como git o svn diff cuando se ha agregado o eliminado un file, es decir, se muestra el file completo . diff desafortunadamente solo imprime un No such file or directory , que no es muy útil. No pude encontrar una opción para esto.

La solución más simple que pude encontrar es analizar la salida de diff y diff -u path <(printf '') o diff -u <(printf '') path function de la ruta existente. Eso es un poco complicado: probablemente 10 líneas de código para lo que podría ser una simple opción de diff .

Otra solución es

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

, pero eso pierde los nombres de file en el diff.

En base a la respuesta de Craig Sanders y la solución anterior, terminé con esto:

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

Editar : Resulta que hay una opción para esto:

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

En otras palabras:

 diff -Nu "$path1" "$path2" 

Con al less algunas versiones de diff diffutils de GNU, puede usar el indicador -N para hacer eso directamente (aunque la documentation parece decir que solo funciona para diffs de directory).

 $ 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. 

¿Has probado diff -u /dev/null filename ?

eso funcionó para mí cuando lo probé.

alternativamente:

 touch missing diff -u missing filename rm missing 

Además, si modifica los directorys (por ejemplo, diff -x /path/to/backup -uN / /path/to/backup ), entonces diff mostrará recursivamente los diffs completos de todos los files, incluidos los que faltan. Necesita la -x, --exclude=PAT porque / ruta / a / copy de security es un subdirectory de /

(gracias a Mat por recordarme la opción -N)