ไปป์ที่แตกต่างไม่ได้หรือ


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
ใช่ฉันแค่ไม่อยากโคลนระบบไฟล์ด้วยไฟล์ one-shot ที่ห้อยอยู่
user394

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

65

นี่เป็นวิธีแก้ปัญหาเดียว: diffดูเหมือนว่าจะยอมรับ <( expr ) เป็น arguemnts:

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

17
ที่ไม่ต่างที่เปลือก (ทุบตี ksh และการสนับสนุน zsh รูปแบบนี้ แต่ก็ไม่ได้ POSIX) ด้วยความช่วยเหลือจากเมล็ด (มันจะต้องให้/dev/fd: diffเห็นอะไรบางอย่างเช่น/dev/fd/3ในบรรทัดคำสั่งของมัน)
Gilles

3
ไม่ใช่ "ต้องระบุ" - เชลล์สามารถสร้างไปป์ชั่วคราวที่มีชื่อสำหรับคุณลักษณะนี้ได้เช่นกัน
ephemient

3
นี่คือคำตอบที่เจ๋งที่สุด!
neves

6
ฉันชอบคำตอบนี้เป็นการส่วนตัว ฉันต้องการ diff สองไฟล์ 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

Piping diff จะเทียบเท่ากับการวิ่ง

diff path/file.name

จากนั้นเมื่อมันทำงานอยู่ให้พิมพ์เนื้อหาทั้งหมดของไฟล์

อย่างที่คุณเห็นนั่นไม่ใช่สิ่งที่คุณคาดหวัง


ไม่มีวิธีแก้ปัญหา? :(
user394

1
ดูคำตอบของ Hemant ฉันไม่รู้จักเลย
มัจฉา

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.