ทำให้ scp เขียนทับหรือสร้างไดเรกทอรีเสมอ


26

ฉันกำลังใช้ scp เพื่อคัดลอกไดเรกทอรีจากเซิร์ฟเวอร์ระยะไกลหนึ่งไปยังไดเรกทอรีใหม่ (IE เพิ่งเปลี่ยนชื่อ) บนเซิร์ฟเวอร์ระยะไกลอื่นเช่น:

scp -prq server1:dir1 server2:dir2

สิ่งนี้ใช้ได้ดีถ้า dir2 ไม่มีอยู่บน server2 มันจะสร้างไดเรกทอรีใหม่ที่ชื่อว่า dir2 ซึ่งมีทุกอย่างจาก dir1 บน server1

ปัญหาเกิดขึ้นเมื่อ dir2 มีอยู่แล้วบน server2 (หมายเหตุ: ฉันไม่มีทางรู้ล่วงหน้าหรือทำการลบบน dir2 บน server2 ล่วงหน้า) - สิ่งที่เกิดขึ้นคือฉันได้รับสำเนาของ dir1 เรียกว่า dir1 ใน dir2

ฉันแน่ใจว่ามีบางสิ่งพื้นฐานที่ฉันขาดหายไป แต่ฉันก็ดูเหมือนจะไม่สามารถแก้ไขได้

ความช่วยเหลือใด ๆ ที่ชื่นชมมาก!

ความนับถือ,

ไจล์ส

โอเคฉันมีน้อยกว่า 10 ตัวแทนและไม่สามารถเป็น $ $ รอ 8 ชั่วโมงดังนั้นนี่คือสิ่งที่ฉันได้รับ:

นี่คือสคริปต์ที่เหมาะกับฉัน:

#!/bin/sh
echo "method 1"
scp -prq server1:dir1/* server2:dir2/ >/dev/null  2>&1

if [ "$?" -ne "0" ]; then
        echo "failed ... trying method 2"
        scp -prq server1:dir1 server2:dir2
fi

exit

ยังไม่แน่ใจว่าจะทำอย่างไรในคำสั่งเดียวหรือแม้กระทั่งถ้าเป็นไปได้

ไชโย @mindthemonkey บางครั้งแค่รับมุมมองใหม่สามารถช่วยชี้ทาง


คุณมีสิทธิ์เข้าถึง scp แต่ไม่ใช่ ssh?
Matt

ถูกต้อง
ไจล์ส

ปัญหาเดียวที่มีคือคุณจะลองทำสำเนาที่สองในความล้มเหลวใด ๆ ซึ่งไม่จำเป็นว่าจะต้องเป็น dir2 ที่ไม่มีอยู่ บางทีถ้าคุณสามารถทำแบบทดสอบที่ไม่ทำสิ่งใดเลย (พูดคำว่า copy dir เปล่า) จากนั้นขึ้นกับเอาต์พุตไม่ว่าจะรัน scp1 หรือ scp2
Matt

จุดที่ดีฉันจะจำไว้ว่าจะไปข้างหน้าและ repost ถ้าฉันมากับบางสิ่งบางอย่าง
ไจล์ส

คุณสามารถ SFTP ได้หรือไม่? cd dir2แล้วตรวจสอบการส่งออกของที่
Matt

คำตอบ:


34

ใช้ไวยากรณ์ "dot" นี้:

scp -prq server1:dir1/. server2:dir2/

สิ่งนี้คัดลอกเนื้อหาของไดเรกทอรีนั้นแทนที่จะเป็นไดเรกทอรีเอง และฉันเชื่อว่ามันพกพาได้ดีกว่า*globbing


2
-p ⇒ "รักษาเวลาการแก้ไขเวลาการเข้าถึงและโหมดจากไฟล์ต้นฉบับ" -r ⇒ "คัดลอกไดเรกทอรีทั้งหมดซ้ำ ๆ " -q ⇒ "ปิดมิเตอร์วัดความคืบหน้า" ที่มา: computerhope.com/unix/scp.htm
kr85

1
สิ่งนี้ทำให้ฉันมีข้อผิดพลาด:scp: error: unexpected filename: .
Andrew Koster

1

โดยปกติเพื่อควบคุมการสร้างไดเรกทอรีคุณต้องใช้การติดตาม/เพื่อบอกถึงเส้นทางที่สมบูรณ์ แต่ฉันคิดว่าสิ่งนี้จะล้มเหลวในการสร้างไดเรกทอรีหากไม่มีอยู่:

scp -prq server1:dir1/* server2:dir2/

สิ่งนี้อาจทำให้พลาดการซ่อน ไฟล์เนื่องจากการขยาย * glob (ไม่มีงานเฉพาะเปลือกที่ยุ่งยากบางอย่าง )

คุณสามารถเข้าใกล้มันแตกต่างกันด้วยและsshtar

ssh server1 "cd dir1 && tar -cf - ." | ssh server2 "( mkdir -p dir2; cd dir2 && tar -xf - )"

แต่นั่นหมายถึงปริมาณการใช้งานจะเข้าสู่เครื่องของคุณ


scp -prq server1: dir1 / * server2: dir2 /
Giles

@Giles คุณพูดว่าใช้งานได้หรือไม่
Matt

1
แปลกฉันแก้ไขที่ แต่มันได้หายไป - ไม่ที่ไม่ทำงานถ้า dir ไม่มีอยู่แล้ว scp ให้ข้อผิดพลาด นอกจากนี้ฉันไม่ได้มี ssh ในกรณีนี้โดยเฉพาะ (ปัญหาเกี่ยวกับสิทธิ์ของผู้ใช้) สิ่งนี้ทำให้ฉันมีความคิดในขณะที่ฉันทำเช่นนี้ในสคริปต์ฉันสามารถลองด้านบนจับข้อผิดพลาดใด ๆ และในข้อผิดพลาดลองรุ่นพื้นฐานจากโพสต์แรกของฉัน ขอบคุณสำหรับความช่วยเหลือ @mindthemonkey
Giles

1
มันเป็นข้อผิดพลาด 'เป็นไดเรกทอรี' เมื่อไม่มีไดเรกทอรีปลายทางสำหรับฉัน
Matt

1
ใช่ฉันเช่นกันข้อผิดพลาดแปลก ๆ เนื่องจากไดเรกทอรีไม่มีอยู่จริง
ไจล์ส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.