पाइप में अंतर नहीं कर सकते?


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 कनेक्शन पर भेजी जाती है), तो आप इसे कहीं भी सहेज नहीं रहे हैं। तो ऐसा नहीं है कि आप किसी भी बैंडविड्थ या कुछ भी बचाते हैं।
डेविड जेड

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 -


जब विशाल फाइलों (जैसे कि लिनक्स डिस्क चित्र) की तुलना में यह उन सभी को कंसोल में आउटपुट कर रहा है! यहां तक ​​कि अंतर -s ("समान" के लिए) यह ऐसा करता है।
user391339

65

यहाँ एक समाधान है: बहस के रूप में diff<( expr ) स्वीकार करना लगता है :

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

17
यह भिन्न नहीं है, यह शेल (बैश, ksh और zsh इस सिंटैक्स का समर्थन करता है, लेकिन यह POSIX नहीं है), कर्नेल की कुछ मदद के साथ (इसे प्रदान करना चाहिए /dev/fd: इसकी कमांड लाइन पर diffकुछ ऐसा दिखता है /dev/fd/3)।
गिल्स

3
यह "प्रदान करना चाहिए" नहीं है - गोले इस सुविधा के लिए अस्थायी नामित पाइप भी बना सकते हैं।
एपेमिएंट

3
यह सबसे अच्छा जवाब है!
नीव

6
मैं व्यक्तिगत रूप से इस उत्तर को पसंद करता हूं। मुझे दो अलग-अलग XML फ़ाइलों को अलग करने की आवश्यकता थी; लेकिन उन्हें पहले ठीक से बनाने की जरूरत थी। इसने इसे आगे बढ़ाया: diff -y <(xmllint --format "${1}") <(xmllint --format "${2}")जिसका मैं अब हर समय उपयोग करता हूं।
पॉल नेल्सन बेकर

यह OS X पर भी बहुत उपयोगी है, जहाँ कोई दो बाइनरी diff <(plutil -convert xml1 -o -- "${1}") <(plutil -convert xml1 -o - -- "${2}")
.plist

4

अलग-अलग पाइपिंग रनिंग के बराबर है

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.