วิธีดาวน์โหลดไฟล์ล่าสุดในโฟลเดอร์โดยใช้ scp


10

ฉันต้องการเรียกใช้ scp transfer เพื่อดาวน์โหลดไฟล์ล่าสุด (ล่าสุด) ในไดเรกทอรีหนึ่งไปยังไดเรกทอรีท้องถิ่นของฉัน

บางสิ่งเช่นนี้

  • แหล่งที่มา :root@rimmer.sk:/home/rimmer/backups/
  • ปลายทาง :/home/rimmer/backups/

backupsขณะที่ได้รับไฟล์ใหม่เท่านั้นไม่ทั้งหมดของพวกเขาใน

คำตอบ:


12

สมมติว่าคุณมีตัวแปรserverและdirกำหนดคุณสามารถทำได้

$ dir="~"
$ server="user@server.com"
$ scp $server:$dir/$(ssh $server 'ls -t $dir | head -1') .

ที่ที่คุณค้นหาไฟล์ใหม่ล่าสุดจากนั้นคัดลอก

หมายเหตุ: ฉันไม่ได้ตรวจสอบความผิดพลาด (เช่นรายการล่าสุดเป็นโฟลเดอร์)


หากเป็นไดเรกทอรีที่จะไม่สแกนอะไรเลย scp -rคุณจำเป็นต้องใช้
slm

@slm ถูกต้อง แต่เขาอาจไม่ต้องการคัดลอก
แบร์นฮาร์ด

หากการscpรับถูกขัดจังหวะมันจะต้องเริ่มการคัดลอกใหม่ตั้งแต่ต้นrsyncสามารถกลับมาทำงานต่อจากจุดที่ค้างไว้ได้
slm

sshสำหรับทุบตีฉันต้องการที่จะเปลี่ยนราคาเดียวกับราคาคู่ในการโต้เถียงไป
Johannes Bittner

1
คุณสามารถลบ $ dir แรกโดยทำดังต่อไปนี้ (เพิ่ม a /*ถึงท้าย $ dir ที่สอง):scp $server:$(ssh $server 'ls -t $dir/* | head -1') .
Jesse

1

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

$ rsync -avz root@rimmer.sk:'$(find /home/rimmer/backups/ -ctime -1)' /home/rimmer/backups/

นี่จะเป็นการคัดลอกไฟล์ที่หายไปหรือเปลี่ยนจากไดเรกทอรีสำรองของ rimmer.sk ในวันสุดท้าย (-ctime -1) ไปยังไดเรกทอรีของข้อมูลสำรองในเครื่องของคุณ

-ctime n
   File's  status  was last changed n*24 hours ago.  See the comments for 
   -atime to understand how rounding affects the interpretation of file 
   status change times.

อ้างอิง


ปัญหาของ rsync นั้นเหมือนกัน หากฉันออฟไลน์เป็นเวลา 2 วันจะพยายามคัดลอกข้อมูลสำรองทั้งหมดจากทุกวันซึ่งฉันไม่ต้องการเลยและมีขนาดใหญ่มาก
Richard Rodriguez

@RichardRodriguez - ตกลงโปรดอัปเดตคำถามของคุณและเจาะจงสิ่งที่คุณต้องการมากขึ้น
slm

2
@slm: ฉันคิดว่าคำถามเป็นไปอย่างที่มันเป็น ฉันแค่ต้องการดาวน์โหลดไฟล์ล่าสุดในไดเรกทอรี ฉันจะอธิบายอะไรเกี่ยวกับมันได้อีก :)
Richard Rodriguez

@RichardRodriguez - ไฟล์ใดอยู่ในไดเรกทอรีนี้ รายการตัวอย่างจะเป็นประโยชน์
slm

1
ทำไมถึงลงคะแนน?
slm

0

สายไปงานเลี้ยงเล็กน้อย แต่บางทีวิธีแก้ปัญหาด้วย ssh และ rsync จะใช้งานได้สำหรับบางคน:

source_host="yourhost.com"
source_dir="/a/dir/on/yourhost.com/"
target_dir="/the/dir/where/last_backup/will/be/placed"
last_backup=$(ssh user@${source_host} "ls -t ${source_dir} | head -1")
if [ "${last_backup}" == "" ]; then
    echo "ERROR: didn't find a backup, cannot continue!"
else
    echo "the last backup is: ${last_backup}"
    rsync -avzh user@${source_host}:${source_dir}/${last_backup} ${target_dir}
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.