Не можете трубу в 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
Да, я просто не хочу испортить мою файловую систему одноразовыми файлами.
user394

1
когда команда не поддерживает стандартный ввод (например, через -), вы можете использовать /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

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
Он не «должен предоставлять» - оболочки могут также создавать временные именованные каналы для этой функции.
Эфимент

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.