Não pode entrar no diff?

74

Eu queria ser inteligente e comparar um arquivo remoto com um arquivo local sem primeiro fazer o download manualmente. Eu posso obter o conteúdo do arquivo remoto

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

No entanto, encanar isso para diff

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

me dá o seguinte:

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

Eu tenho chaves ssh configuradas, por isso não está me solicitando uma senha. O que é uma solução alternativa para isso?

user394
fonte
5
A propósito, você ainda está baixando o arquivo ao fazer isso (já que o conteúdo é enviado pela conexão SSH), você não está salvando em nenhum lugar. Portanto, não é como você economizar largura de banda ou algo assim.
David Z
2
Sim, eu só não quero estragar meu sistema de arquivos com arquivos únicos por aí.
user394
1
para quando o comando não suportar stdin (por exemplo, via -), você poderá usar /dev/stdin. por exemplo,diff file1 /dev/stdin
ctrl-alt-Delor

Respostas:

92

Tente usar -para representar a entrada padrão.

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

Hemant
fonte
ao comparar arquivos gigantes (como imagens de disco linux), eles estão gerando todos eles para o console! mesmo com diff -s (para "igual"), ele faz isso.
user391339
65

Aqui está uma solução alternativa: diffparece aceitar <( expr ) como argumentemnts:

diff <(ssh \"cat path/file.name/") <(cat path/file.name)
user394
fonte
17
Isso não é diff, é o shell (bash, ksh e zsh suportam essa sintaxe, mas não é POSIX), com alguma ajuda do kernel (ele deve fornecer /dev/fd: diffvê algo como /dev/fd/3na linha de comando).
Gilles
3
Ele não "deve fornecer" - os shells também podem criar pipes nomeados temporários para esse recurso.
ephemient 24/09/10
3
esta é a resposta mais legal!
Neves
6
Eu pessoalmente prefiro esta resposta. Eu precisava diferenciar dois arquivos XML diferentes; mas eles precisavam ser adequadamente formados primeiro. Isso levou a isso: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")que agora uso o tempo todo.
Paul Nelson Baker
Isso também é muito útil no OS X, onde se pode comparar dois arquivos .plist binários:diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
morgant
4

Canalizar para diff é equivalente a executar

diff path/file.name

e, em seguida, quando estiver em execução, digite todo o conteúdo do arquivo.

Como você pode ver, não é o que você esperava.

Macha
fonte
Nenhuma solução alternativa? :(
user394
1
Veja a resposta de Hemant. Eu não sabia de um.
Macha
1
diff /tmp/localtempfile <(ssh -A -o StrictHostKeyChecking=no root@server "cat /tmp/remotetempfile")
Michael Mrozek
fonte
O que há com a redução da segurança StrictHostKeyChecking=no? Caso contrário, uma boa resposta.
ctrl-alt-Delor