Не можете трубу в 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, поэтому он не запрашивает пароль. Какой обходной путь для этого?

user394
источник
5
Кстати, вы все еще загружаете файл, когда делаете это (поскольку его содержимое отправляется по SSH-соединению), вы просто нигде не сохраняете его. Так что это не значит, что вы сохраняете пропускную способность или что-то еще
Дэвид Z
2
Да, я просто не хочу испортить мою файловую систему одноразовыми файлами.
user394
1
когда команда не поддерживает стандартный ввод (например, через -), вы можете использовать /dev/stdin. напримерdiff file1 /dev/stdin
ctrl-alt-delor

Ответы:

92

Попробуйте использовать -для представления стандартного ввода.

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

Hemant
источник
при сравнении гигантских файлов (таких как образы дисков Linux) это выводит их все на консоль! даже с diff -s (для «же») это делает.
user391339
65

Вот один из обходных путей: diffкажется, принимает <( expr ) в качестве аргумента:

diff <(ssh \"cat path/file.name/") <(cat path/file.name)
user394
источник
17
Это не diff, это оболочка (bash, ksh и zsh поддерживают этот синтаксис, но это не POSIX), с некоторой помощью от ядра (оно должно обеспечить /dev/fd: diffвидит что-то вроде /dev/fd/3в своей командной строке).
Жиль "ТАК - перестань быть злым"
3
Он не «должен предоставлять» - оболочки могут также создавать временные именованные каналы для этой функции.
Эфимент
3
это самый крутой ответ!
Невес
6
Я лично предпочитаю этот ответ. Мне нужно было разнести два разных файла XML; но они должны были быть правильно сформированы в первую очередь. Это привело к этому: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")который я сейчас использую все время.
Пол Нельсон Бейкер
Это также очень полезно в OS X, где можно сравнить два двоичных файла .plist: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