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?


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 -


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)

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.


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")

O que há com a redução da segurança StrictHostKeyChecking=no? Caso contrário, uma boa resposta.
ctrl-alt-Delor
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.