สามารถคัดลอกไดเรกทอรีสำเนาซ้ำ?


572

ขณะนี้ฉันสามารถคัดลอก.tarไฟล์เดียวเท่านั้น แต่ฉันจะคัดลอกไดเรกทอรีซ้ำด้วยได้scpอย่างไร

คำตอบ:


935

ใช่ใช้-r:

scp -rp sourcedirectory user@dest:/path
  • -r หมายถึงการเรียกซ้ำ
  • -p รักษาเวลาการแก้ไขเวลาการเข้าถึงและโหมดจากไฟล์ต้นฉบับ

หมายเหตุ: สิ่งนี้จะสร้างsourcedirectoryภายใน/pathซึ่งไฟล์จะอยู่ใน/path/sourcedirectory


9
อย่างไรก็ตามโปรดจำไว้ว่าการทำเช่นนี้จะไม่เก็บ symlink ไว้
CpnCrunch

12
โปรดทราบว่า-pr(ตัวเลือกในลำดับที่กลับรายการ) จะไม่คัดลอกโฟลเดอร์ แต่จะฝังเนื้อหาไว้ในไดเรกทอรีเป้าหมาย (เห็นได้ชัดว่าลำดับตัวเลือกมีความสำคัญ)
pms

171

ในขณะที่คำตอบก่อนหน้านี้ถูกต้องทางเทคนิคคุณควรพิจารณาใช้rsyncแทน rsyncเปรียบเทียบข้อมูลในด้านการส่งและรับกับกลไกต่างดังนั้นจึงไม่จำเป็นต้องส่งข้อมูลที่ถูกส่งไปก่อนหน้านี้แล้ว

rsyncหากคุณกำลังจะไปคัดลอกบางสิ่งบางอย่างไปยังเครื่องระยะไกลมากกว่าหนึ่งครั้งการใช้งาน ที่จริงแล้วมันดีที่จะใช้rsyncทุกครั้งเพราะมันมีการควบคุมเพิ่มเติมสำหรับสิ่งต่าง ๆ เช่นการคัดลอกการอนุญาตไฟล์และการเป็นเจ้าของและการยกเว้นไฟล์หรือไดเรกทอรีบางอย่าง โดยทั่วไป:

$ rsync -av /local/dir/ server:/remote/dir/

จะประสานไดเรกทอรีท้องถิ่นกับไดเรกทอรีระยะไกล หากคุณรันครั้งที่สองและเนื้อหาของโลคัลไดเร็กทอรีไม่ได้เปลี่ยนแปลงจะไม่มีการถ่ายโอนข้อมูลซึ่งมีประสิทธิภาพมากกว่าการรันscpและคัดลอกทุกอย่างทุกครั้ง

นอกจากนี้ยังช่วยให้คุณสามารถกู้คืนจากการโอนขัดจังหวะได้อย่างง่ายดายมากซึ่งแตกต่างจากrsyncscp

ในที่สุดรุ่นที่ทันสมัยของการrsyncเริ่มต้นทำงานมากกว่า ssh ดังนั้นหากscpทำงานอยู่แล้วrsyncควรแทนที่การดรอปอิน


1
ฉันเห็นด้วยrsyncมีประสิทธิภาพมากขึ้น สิ่งหนึ่งที่ไม่ทำในขณะนี้scpคืออนุญาตให้คัดลอกระหว่างโฮสต์ระยะไกล (อย่างน้อยโดยไม่เรียกใช้ไคลเอ็นต์ rsync กับหนึ่งในนั้น)
Cedric Knight

1
-av: v สำหรับ verbose, สำหรับการเก็บถาวรและเป็นทางลัดไปยัง -rlptgoD ซึ่งหมายถึงการเรียกซ้ำ, รักษาวันที่และสิทธิ์ของเจ้าของลิงก์ ถ้าคุณต้องการใช้แบบเรียกซ้ำ-r
pdem


10

ตัวเลือกการคัดลอกซ้ำ '-r' (ตัวพิมพ์เล็ก)

scp -r

ซึ่งฉันสับสนกับตัวเลือกการทำซ้ำแบบโลคอลทั่วไป '-R' (ตัวพิมพ์ใหญ่)

cp -R

1
ฉันแค่ต้องการชี้ให้เห็นความแตกต่างระหว่าง cp และ scp เนื่องจาก -r และ -R นั้นไม่เหมือนกัน unix.stackexchange.com/questions/18712/…
Tarun

6

วิธีที่ดีที่สุดคือใช้ rsync ผ่าน SSH

rsync -a -essh /source/ user@dest-server:/dest/

rsync -a -essh user@source-server:/source/ /dest/

ตัวเลือกรายการโปรดของฉันคือ -Pazvessh - ลบ:

  • -a: โหมดเก็บถาวร (รวมถึงตัวเลือกทั่วไปเริ่มต้นจำนวนมากรวมถึงการรักษา symlink)
  • -z: บีบอัด
  • -v: verbose: แสดงไฟล์
  • -P: แสดง progess เป็นไฟล์ที่ทำ / ไฟล์ที่เหลือ
  • -e ssh: ทำ rsync ในโปรโตคอล ssh
  • - ลบ: ลบไฟล์ในปลายทางที่ไม่ได้อยู่ในแหล่งที่มาอีกต่อไป

ทุกเวอร์ชันrsyncที่ฉันใช้จะใช้เป็นsshค่าเริ่มต้นดังนั้นจึง-esshไม่จำเป็นต้องใช้ และตัวเลือกของคำสั่งที่ใช้เชื่อมต่อกับรีโมตโฮสต์นั้นไม่เกี่ยวข้องกับการคัดลอกซ้ำ ๆ
kasperd

4

หลังจากค้นหาการตั้งค่าสถานะการคัดลอกซ้ำและใช้งานได้สำเร็จขอบคุณโพสต์นี้ฉันต้องการโพสต์เพียงข้อเสนอแนะ

หากเป็นกรณีที่คุณกำลังคัดลอก (ซ้ำ) ไดเรกทอรี บางทีถ้าไฟล์ถูกบีบอัดคุณสามารถประหยัดเวลาในการถ่ายโอนได้

สิ่งที่ฉันทำในท้ายที่สุดคือ:

local$ tar -czvf local.tar.gz directory/
local$ scp local.tar.gz user@remote:/directory
ssh user@remote
remote$ tar -xzvf local.tar.gz

หวังว่านี่จะช่วยได้


นามสกุลไฟล์ควรเป็นไฟล์ใดไฟล์หนึ่ง.tar.gzหรือ.tgzตั้งแต่ไฟล์เป็นไฟล์เก็บถาวร gzipped tar (เนื่องจาก-zมีการใช้แฟล็ก)
anthonybell

2

คุณสามารถคัดลอกไดเรกทอรีซ้ำไปยังที่เก็บถาวรที่บีบอัดด้วยคำสั่งง่ายๆนี้:

ssh -p 22 user@address-to-copy-from.com  'cd /parent/directory && tar zcvf - directory_to_copy' > /destination/on/your/machine/archive_name.tgz

ตัวอย่างเช่นหากต้องการคัดลอกเนื้อหา/var/logจากdomain.comไปยัง~/logs.tgzคุณให้เรียกใช้:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' > ~/logs.tgz

คุณยังสามารถแตกไฟล์บนระบบเป้าหมายโดยใช้ไพพ์ คำสั่งนี้จะคัดลอกเนื้อหาของ/var/logที่domain.comไป~/destination/logในระบบของคุณ:

ssh -p 22 user@domain.com  'cd /var && tar zcvf - log' | tar xzf - -C ~/destination

แม้ว่าจะทำมิเรอร์ไดเรกทอรีคุณควรใช้rsync...


1

หากคุณต้องการส่งรหัสผ่านของผู้ใช้เป็นพารามิเตอร์แทนที่จะป้อนเป็นแบบโต้ตอบคุณสามารถใช้sshpass( sudo apt-get install -y sshpass)

ตัวอย่าง:

sshpass -p 'remote_password' scp -rp /src/folder myremoteusername@122.10.12.123:/dest/folder

0

คุณสามารถใช้อ็อพชัน -r พร้อมกับคำสั่ง scp เพื่อคัดลอกไดเร็กทอรีซ้ำบนระบบใด ๆ หากคุณต้องการสิ่งอื่นดูกวดวิชาคำสั่ง SCP ตัวเลือก -r หมายถึงการดำเนินการซ้ำในส่วนใหญ่ของคำสั่ง Linux


ในขณะที่เป็นความจริง-rตัวเลือกได้รับการแนะนำเมื่อหลายปีก่อนและเป็นคำตอบที่ได้รับการยอมรับ
RalfFriedl

-3

ตัวเลือกอื่น (น่าจะดีกว่าสำหรับการใช้ซ้ำ) คือการใช้ NFS - ดูที่ nfs-kernel-server และวิธีการตั้งค่าการแบ่งปัน NFS


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