¿No se puede conectar a diff?

74

Quería ser inteligente y comparar un archivo remoto con un archivo local sin descargarlo primero manualmente. Puedo obtener el contenido del archivo remoto por

ssh user@remote-host "cat path/file.name"

Sin embargo, canalizando eso a diff

ssh user@remote-host "cat path/file.name" | diff path/file.name

me da esto:

diff: missing operand after `path/file.nae'
diff: Try `diff --help' for more information.

Tengo configuradas las claves ssh, por lo que no me solicita una contraseña. ¿Qué es una solución para esto?

usuario394
fuente
55
Por cierto, todavía estás descargando el archivo cuando haces esto (ya que su contenido se envía a través de la conexión SSH), simplemente no lo estás guardando en ningún lado. Por lo tanto, no es que guarde ningún ancho de banda ni nada.
David Z
2
Sí, simplemente no quiero arruinar mi sistema de archivos con archivos de una sola vez.
user394
1
para cuando el comando no admite stdin (por ejemplo, vía -), puede usarlo /dev/stdin. por ejemplodiff file1 /dev/stdin
ctrl-alt-delor

Respuestas:

92

Intente usar -para representar la entrada estándar.

ssh user@remote-host "cat path/file.name" | diff path/file.name -

Hemant
fuente
Al comparar archivos gigantes (como imágenes de disco de Linux), ¡esto los envía a la consola! incluso con diff -s (para "mismo") hace esto.
user391339
65

Aquí hay una solución alternativa: diffparece aceptar <( expr ) como argumentos:

diff <(ssh \"cat path/file.name/") <(cat path/file.name)
usuario394
fuente
17
Eso no es diff, ese es el shell (bash, ksh y zsh admiten esta sintaxis, pero no es POSIX), con algo de ayuda del núcleo (debe proporcionar /dev/fd: diffve algo así como /dev/fd/3en su línea de comando).
Gilles 'SO- deja de ser malvado'
3
No "debe proporcionar": los shells también pueden crear canalizaciones con nombre temporales para esta característica.
Ephemient
3
esta es la mejor respuesta!
neves
66
Personalmente prefiero esta respuesta. Necesitaba diferenciar dos archivos XML diferentes; pero primero debían formarse adecuadamente. Eso llevó a esto: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")que ahora uso todo el tiempo.
Paul Nelson Baker,
Esto también es muy útil en OS X, donde uno podría querer comparar dos archivos binarios .plist:diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
morgant
4

Tubería en diff es equivalente a correr

diff path/file.name

y luego, una vez que se está ejecutando, escribe todo el contenido del archivo.

Como puede ver, eso no es lo que esperaba.

Macha
fuente
No hay solución? :(
user394
1
Mira la respuesta de Hemant. No sabía de uno.
Macha
1
diff /tmp/localtempfile <(ssh -A -o StrictHostKeyChecking=no root@server "cat /tmp/remotetempfile")
Michael Mrozek
fuente
¿Qué pasa con la reducción de la seguridad StrictHostKeyChecking=no? De lo contrario, una buena respuesta.
ctrl-alt-delor