rsync N ไฟล์ใหม่ล่าสุดในไดเรกทอรี


6

อะไรจะเป็นวิธีที่ง่ายที่สุดในการบอกเล่าเกี่ยวกับไฟล์ใหม่ล่าสุดในไดเรกทอรีไปยังเซิร์ฟเวอร์ระยะไกล


หากคุณต้องการอัปเดตแล้ว rsync มีสวิตช์ - อัปเดต คุณสามารถใช้findกับheadถ้าคุณต้องการไฟล์ N ล่าสุดและไพพ์นี้ลงใน rsync คุณอาจจะต้องใช้ xargs แต่ฉันไม่รู้แน่
QuickishFM

คำตอบ:


6

วิธีที่ง่ายที่สุดคือเรียกใช้ zsh แทน bash

rsync -a -- /path/to/directory/*(om[1,42]) remote-server:

ในวงเล็บให้เรียงomลำดับไฟล์ตามเวลาการแก้ไขแบบย้อนกลับ (เช่นโดยการเพิ่มอายุ) และ[1,42]เลือกการแข่งขัน 42 รายการแรก

หากคุณต้องการไฟล์ปกติเท่านั้นและไม่ใช่ไดเรกทอรีให้เพิ่ม a .หลังวงเล็บเปิด สำหรับความเป็นไปได้เพิ่มเติมให้ดูที่“ ตัวระบุแบบกลม” ในzshexpnหน้าคู่มือ

หากคุณต้องการจับคู่ไฟล์ในทรีของไดเรกทอรีที่ rooted /path/to/directoryแทนที่จะใช้เฉพาะในไดเรกทอรี/path/to/directory/**/*(.om[1,42])นั้น สิ่งนี้จะส่งไฟล์ทั้งหมดไปยังไดเรกทอรีเดียวกันบนเป้าหมาย


FYI ฉันต้องเพิ่มเครื่องหมายคำพูดเดี่ยวรอบ '* (อ้อม [1,42])' เพื่อให้ทำงานได้ ฉันกำลังคัดลอกไฟล์จากเซิร์ฟเวอร์ระยะไกลไปยังท้องถิ่นแม้ว่า
2

@ c2 เครื่องหมายคำพูดทำให้สัญลักษณ์แทนถูกขยายบนเครื่องระยะไกล พวกเขาจำเป็นต้องใช้ในเส้นทางระยะไกล (และจะทำงานเฉพาะถ้าเปลือกเข้าสู่ระบบของคุณบนเครื่องระยะไกลใน zsh) และจะไม่ทำงานบนเส้นทางท้องถิ่น
Gilles

2

สมมติว่าคุณต้องการส่งไฟล์จากไดเรกทอรีการทำงานปัจจุบัน:

rsync `ls -tp | grep -v / | head -n <n>` <destination> <options>

จะทำเคล็ดลับ ตัวอย่างเช่น:

rsync `ls -tp | grep -v / | head -n 10` user@host:/dest/dir/ --progress --compress

สิ่งนี้จะทำให้เกิดข้อผิดพลาดหากไม่มีไฟล์ที่จะพบในไดเรกทอรีการทำงานปัจจุบันหรือถ้าไฟล์ด้านบนใด ๆ มีช่องว่างหรืออักขระพิเศษอื่น ๆ

`อักขระรอบ ๆls -tp | grep -v / | head -n <n>บอกให้ทุบตีเพื่อเรียกใช้คำสั่งและแทนที่ด้วยรายการไฟล์ผลลัพธ์เป็นรายการคั่นด้วยช่องว่าง -tตัวเลือกที่บอกlsเพื่อจัดเรียงตามการประทับเวลาที่-pจะบอกว่ามันจะเพิ่ม/หลังจากที่ชื่อไดเรกทอรีและ grep ส่วนหน้าจอออกเส้นสิ้นสุด/เพื่อให้คุณไม่สิ้นสุดการส่งไดเรกทอรีมากกว่า เพิ่ม-cไปยังlsตัวเลือกหากคุณต้องการให้ตัดสินไฟล์ล่าสุดด้วยเวลาการสร้างแทนที่จะเป็นเวลาแก้ไข (แต่โปรดทราบว่าบางโปรแกรมจะลบและแทนที่ไฟล์แทนที่จะอัปเดตไฟล์เหล่านั้นเพื่อให้ ctime และ mtime สามารถเหมือนกันแม้ว่าไฟล์นั้นจะมี รับอีกต่อไป)

ฉันจะไม่อ้างว่ามันเป็นวิธีที่ง่ายที่สุดแต่ก็เป็นวิธีที่ฉันคิดไว้ก่อน


(คำถามย่อยในคำถามของ mwm)

แล้วรอบ ๆ ล่ะ? เซิร์ฟเวอร์ไปยังท้องถิ่นหรือไม่

นั่นจะซับซ้อนกว่านี้เล็กน้อยเนื่องจากฉันไม่คิดว่าคุณจะมีแหล่งไฟล์ระยะไกลได้หลายแหล่งในบรรทัดคำสั่ง rsync เหมือนกับที่คุณสามารถใช้แหล่งข้อมูลท้องถิ่นได้ คุณสามารถเรียกใช้rsyncบนเซิร์ฟเวอร์ผ่านทางsshเปิดอุโมงค์กลับสู่ท้องถิ่นของคุณsshd(ด้วยการsshร้องขอเดียวกับที่คุณเรียกใช้ rsync ผ่าน) เพื่อรับการเชื่อมต่อโดยใช้คำสั่งเดียวกันจากอีกด้านหนึ่งเป็นหลัก


ห้ามใช้คำสั่งนี้ยกเว้นว่าคุณรู้ว่าชื่อไฟล์ไม่สามารถมีอักขระ“ พิเศษ” ใด ๆ (ช่องว่าง,, \[?*อักขระควบคุมหรืออักขระที่ไม่ใช่ ASCII)
Gilles

แล้วรอบอื่น ๆ ล่ะ? เซิร์ฟเวอร์ไปยังท้องถิ่นหรือไม่
mwm

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