diffにパイプできませんか?


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接続経由で送信するため、これを行うときもファイルをダウンロードしていますが、どこにも保存していません。したがって、帯域幅などを節約するわけではありません。
デビッドZ

2
ええ、私はただワンショットのファイルがぶらぶらしてファイルシステムを台無しにしたくないだけです。
ユーザー394

1
コマンドがstdinをサポートしていない場合(経由など-)、を使用できます/dev/stdin。例diff file1 /dev/stdin
ctrl-alt-delor

回答:


92

-標準入力を表すために使用してみてください 。

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


巨大なファイル(Linuxディスクイメージなど)を比較するとき、これはすべてをコンソールに出力します!diff -s(「同じ」の場合)でもこれを行います。
user391339 14年

65

1つの回避策があります:diff<(expr)を引数として受け入れるようです:

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

17
それは(それが提供しなければならないカーネルからいくつかの助けを借りて、それが(この構文はbash、kshのとzshのサポートが、それはPOSIXではない)シェルだ、差分はありません/dev/fddiffのようなものを見て/dev/fd/3、コマンドライン上で)。
ジル

3
「提供する必要はありません」-シェルはこの機能のために一時的な名前付きパイプも作成できます。
一時的な

3
これが最もクールな答えです!
11

6
私は個人的にこの答えを好みます。2つの異なるXMLファイルを比較する必要がありました。しかし、それらは最初に適切に形成される必要がありました。それがこれにつながりました:diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")私は今、いつも使っています。
ポールネルソンベイカー14年

これは、2つのバイナリ.plistファイルを比較したいOS Xでも非常に便利ですdiff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
。– morgant

4

diffへのパイピングは実行と同等です

diff path/file.name

そして、実行されたら、ファイルの内容全体を入力します。

ご覧のとおり、それは期待したものではありません。


回避策はありませんか?:(
user394

1
ヘマントの答えを見てください。私はそれを知りませんでした。
マチャ

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

セキュリティの低下とは何StrictHostKeyChecking=noですか?そうでなければ良い答え。
ctrl-alt-delor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.