Non riesci a convogliare in diff?


74

Volevo essere intelligente e confrontare un file remoto con un file locale senza prima scaricarlo manualmente. Posso ottenere il contenuto del file remoto da

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

Tuttavia, esegui il piping a diff

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

mi dà questo:

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

Ho i tasti SSH impostati, quindi non mi richiede una password. Che cosa è una soluzione alternativa per questo?


5
A proposito, stai ancora scaricando il file quando lo fai (poiché il suo contenuto viene inviato tramite la connessione SSH), non lo stai salvando da nessuna parte. Quindi non è come se tu risparmiassi larghezza di banda o altro.
David Z,

2
Sì, non voglio semplicemente confondere il mio file system con i file one-shot in giro.
user394,

1
per quando il comando non supporta stdin (ad es. via -), è possibile utilizzare /dev/stdin. ad es.diff file1 /dev/stdin
ctrl-alt-delor

Risposte:


92

Prova a utilizzare -per rappresentare l'input standard.

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


quando si confrontano file giganti (come immagini di dischi linux) questo li sta mandando tutti alla console! anche con diff -s (per "stesso") lo fa.
user391339,

65

Ecco una soluzione alternativa: diffsembra accettare <( expr ) come argomentazioni:

diff <(ssh \"cat path/file.name/") <(cat path/file.name)

17
Non è diff, è la shell (bash, ksh e zsh supportano questa sintassi, ma non è POSIX), con un po 'di aiuto dal kernel (deve fornire /dev/fd: diffvede qualcosa di simile /dev/fd/3sulla sua riga di comando).
Gilles 'SO- smetti di essere malvagio' il

3
Non "deve fornire" - le shell possono creare pipe nominative temporanee anche per questa funzione.
effimero

3
questa è la risposta più bella!
neves

6
Personalmente preferisco questa risposta. Avevo bisogno di diff due diversi file XML; ma prima dovevano essere adeguatamente formati. Ciò ha portato a questo: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")che ora uso sempre.
Paul Nelson Baker,

Questo è anche molto utile su OS X dove si potrebbe voler confrontare due file binari .plist:diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
morgant

4

Il piping in diff equivale alla corsa

diff path/file.name

e poi, una volta in esecuzione, digitando l'intero contenuto del file.

Come puoi vedere, non è quello che ti aspettavi.


Nessuna soluzione alternativa? :(
user394

1
Guarda la risposta di Hemant. Non ne sapevo nulla.
Macha,

1
diff /tmp/localtempfile <(ssh -A -o StrictHostKeyChecking=no root@server "cat /tmp/remotetempfile")

Che cos'è l'abbassamento della sicurezza StrictHostKeyChecking=no? Altrimenti una buona risposta.
ctrl-alt-delor
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.