วิธีการ _MOVE_ ไฟล์ด้วย scp


46

จะไม่คัดลอก แต่ย้ายไฟล์จากเซิร์ฟเวอร์หนึ่งไปยังเซิร์ฟเวอร์อื่น (ทั้ง Linux) ได้อย่างไร

man scpไม่ได้ให้ประโยชน์อะไรกับฉันเลย ฉันไม่สามารถใช้ 'scp' แล้ว 'rm' ได้เพราะต้องแน่ใจว่าไฟล์นั้นถูกถ่ายโอนสำเร็จ หากมีข้อผิดพลาดระหว่างการถ่ายโอนไฟล์จะต้องไม่ถูกลบ

บางทีฉันควรใช้รหัสออกอย่างใด แต่อย่างไร นอกจากนี้ยังมีไฟล์จำนวนมากและหากไฟล์สุดท้ายล้มเหลวก็จะเป็นตัวเลือกที่ไม่ดีให้เก็บไฟล์ที่ถ่ายโอนสำเร็จทั้งหมด

อาจจะมีบางอย่างนอกเหนือจาก SCP?

คำตอบ:


47

rsync บน ssh น่าจะเป็นทางออกที่ดีที่สุดของคุณด้วย--remove-source-filesตัวเลือก

rsync -avz --remove-source-files -e ssh /this/dir remoteuser@remotehost:/remote/dir 

การทดสอบอย่างรวดเร็วให้;

[tomh@workstation001 ~]$ mkdir test1
[tomh@workstation001 ~]$ mkdir test2
[tomh@workstation001 ~]$ touch test1/testfile.1
[tomh@workstation001 ~]$ ls test1/
testfile.1
[tomh@workstation001 ~]$ rsync --remove-source-files -av -e ssh test1/testfile.1 tomh@localhost:/home/tomh/test2/
sending incremental file list

sent 58 bytes  received 12 bytes  10.77 bytes/sec
total size is 0  speedup is 0.00

[tomh@workstation001 ~]$ ls test1/
[tomh@workstation001 ~]$
[tomh@workstation001 ~]$ ls test2/
testfile.1

ดังที่ @SvenW กล่าวถึง-e sshเป็นค่าเริ่มต้นดังนั้นสามารถละเว้นได้


7
-e sshเป็นค่าเริ่มต้นโดยนัยเป็นเวลาหลายปีแล้วโดยปกติไม่จำเป็นต้องใช้พารามิเตอร์นี้อีกต่อไป
สเวน

@SewW อารู้ดี! ฉันไม่ต้องการ rsync แบบวันต่อวันเนื่องจาก scp รองรับโหมดแบบเรียกซ้ำสำหรับวัตถุประสงค์ส่วนใหญ่
Tom H

หลังจากนั้นใช้สิ่งนี้เพื่อล้างโฟลเดอร์ว่าง ๆ (rsync จะไม่ลบออก): serverfault.com/a/95935/58568
bmaupin

1
เพิ่งเพิ่มsmv() { rsync -az --remove-source-files "$@"; }ไปยังกล่องเครื่องมือของฉัน ขอขอบคุณ.
ริส Ulerich

ถ้าคุณไม่มี rsync ล่ะ ตัวอย่างเช่น OpenWrt ไม่มี rsync และฉันจำเป็นต้องใช้ scp เพื่อย้ายไฟล์ ต้องทำอะไรตอนนี้
valentt


17

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

scp foo user@server:/destination && rm foo

ฉันใช้จุดของคุณเกี่ยวกับหลาย ๆ ไฟล์เพื่อคัดลอกและจัดการความล้มเหลวของสแต็กอย่างถูกต้องดังนั้นสำหรับหลายไฟล์:

for file in bar*; do scp "$file" user@server:/destination && rm "$file" ; done

สุดท้ายนี้ใช้ได้จริง ๆ ถ้าคุณใช้ssh-agentแต่ฉันหวังว่าคุณจะ


1
ฉันรู้สึกว่านี่น่าจะเป็นคำตอบ มันตอบคำถามที่ถามอย่างแม่นยำ
Travis Griggs

ในขณะที่ SCP ไม่จัดการกับข้อ จำกัด ของวง (AFAIK) ฉันใช้คำตอบของคุณกับ rsync เพื่อย้ายไฟล์ทีละวงตามที่กำหนดไว้ ขอบคุณมาก!
Moonchild

@ Moonchild, scp สามารถจัดการขีด จำกัด แบนด์วิดท์ได้โดยใช้-lแฟล็ก เช่น-l 8192เพื่อ จำกัด การถ่ายโอนที่ 8192 kb / s
Spencer D

3

ในสถานการณ์ของฉันพอร์ต ssh ไม่ใช่ 22 ดังนั้น

rsync -avz --remove-source-files -e "ssh -p $portNumber" user@remoteip:/path/to/files/ /local/path/

ทำงานได้สำหรับฉัน


5
คุณจะดีกว่าการใส่หมายเลขพอร์ต ssh ที่กำหนดเองลงในไฟล์ ssh config (~ / .ssh / config) ของคุณมากกว่าการระบุไว้สำหรับทุกคำสั่ง สามารถระบุได้ทั้งแบบโกลบอลต่อโฮสต์หรือสำหรับนิพจน์ทั่วไปที่ตรงกับชื่อโฮสต์
แอบ

วิธีการตั้งค่าพอร์ตแยกต่างหากทั้งสำหรับต้นทางและปลายทาง
Brethlosze

3

หากคุณมีเซิร์ฟเวอร์เป้าหมายที่เก่ากว่าอย่างที่คุณเป็นคุณไม่สามารถใช้งานได้

--remove-source-files

แต่คุณต้องใช้

--remove-sent-files --protocol=29

แทน.


3

หากทำในสองขั้นตอนไม่มีปัญหาคุณสามารถใช้scpเพื่อคัดลอกไฟล์จากเซิร์ฟเวอร์ระยะไกลแล้วดำเนินssh -e "rm /path/to/file"การลบออกจากดิสก์ เมื่อทำการย้ายไฟล์โดยเฉพาะระหว่างเครื่องสิ่งต่าง ๆ อาจจะผิดปกติดังนั้นจึงเป็นการดีที่จะทำการคัดลอกและลบแยกต่างหากและจะทำการลบไฟล์ออกเมื่อคุณรู้ว่าไฟล์นั้นถูกคัดลอกมาเรียบร้อยแล้ว

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