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)