Не вдається дістатися в різницю?


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
Так, я просто не хочу переробляти мою файлову систему однофакторними файлами, що звисають навколо.
користувач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 (для "того ж") це робить.
користувач391339

65

Ось один спосіб вирішення: diffсхоже, приймає <( expr ) як аргументи:

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

17
Це не відрізняється, це оболонка (bash, ksh та zsh підтримують цей синтаксис, але це не POSIX), з деякою допомогою ядра (він повинен надати /dev/fd: diffбачить щось подібне /dev/fd/3у своєму командному рядку).
Жиль

3
Він не повинен "надавати" - оболонки можуть створювати тимчасові названі труби і для цієї функції.
ефемієнт

3
це найкрутіша відповідь!
neves

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
Подивіться на відповідь Геманта. Я не знав жодного.
Мача

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.