无法通过管道传递到差异?


74

我想变得聪明一点,将远程文件与本地文件进行比较,而无需先手动下载它。我可以通过以下方式获取远程文件的内容

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

但是,将其传递给 diff

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

给我这个:

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

我已经设置了ssh密钥,因此它不会提示我输入密码。有什么解决方法?


5
顺便说一下,执行此操作时仍在下载文件(由于其内容是通过SSH连接发送的),因此您只是没有将其保存在任何地方。因此,这不像您节省任何带宽或任何东西。
David Z

2
是的,我只是不想破坏我的文件系统,而一键挂起文件。
user394 2010年

1
当命令不支持stdin时(例如通过-),可以使用/dev/stdin。例如diff file1 /dev/stdin
ctrl-alt-delor

Answers:


92

尝试使用 -代表标准输入。

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


比较巨型文件(例如linux磁盘映像)时,这会将它们全部输出到控制台!即使使用diff -s(对于“相同”),它也会这样做。
2014年

65

这是一种解决方法:diff似乎接受<(expr)作为争辩者:

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

17
这不是diff,而是外壳程序(bash,ksh和zsh支持此语法,但不是POSIX),并且在内核的帮助下(它必须提供/dev/fd:在其命令行中提供diff类似的/dev/fd/3功能)。
吉尔斯

3
它不是“必须提供”的,shell也可以为此功能创建临时的命名管道。
短暂

3
这是最酷的答案!
neves 2011年

6
我个人更喜欢这个答案。我需要比较两个不同的XML文件。但是它们需要首先正确地形成。结果就是这样:diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")我现在一直在使用它。
保罗·尼尔森·贝克

这在OS X上非常有用,在OS X上可能要比较两个二进制.plist文件:diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
morgant

4

用管道传递到差异相当于运行

diff path/file.name

然后,一旦运行,键入文件的全部内容。

如您所见,这不是您所期望的。


没有解决方法?:(
user394 2010年

1
看一下赫曼特的答案。我不知道一个。
Macha 2010年

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

降低安全性是StrictHostKeyChecking=no什么?否则一个很好的答案。
ctrl-alt-delor
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.