Rsync: คัดลอกผ่านการประทับเวลาเท่านั้น


42

ขณะนี้ฉันมีสองไดเรกทอรี A / และ B / ซึ่งเหมือนกันทุกประการยกเว้นการประทับเวลา ดังนั้นถ้าฉันใช้คำสั่ง:

rsync --dry-run -crvv A/ B/

จากนั้นไฟล์ทั้งหมดจะถูกทำเครื่องหมาย "uptodate" ในขณะที่คำสั่ง:

rsync --dry-run -rvv A/ B/

แสดงให้เห็นว่าไฟล์ทั้งหมดจะถูกคัดลอกมาจาก A / ถึง B /

คำถามของฉันคือ: เนื่องจากฉันรู้ว่าไฟล์เหมือนกัน (ในส่วนที่เกี่ยวกับเนื้อหา) จากนั้นจะมีวิธีใด ๆ (ผ่าน rsync หรืออื่น ๆ ) เพื่อตั้งค่าการประทับเวลาสำหรับไฟล์ใน B / ให้เหมือนกับเวลาบันทึกของไฟล์ใน A / โดยไม่คัดลอกไฟล์ทั้งหมดจาก A / B /?

ขอบคุณ


หากคุณรู้ว่าไฟล์เหมือนกันทำไมคุณต้องออกนอกเส้นทางเพื่อไม่คัดลอกไฟล์เหล่านั้นเพื่อให้ได้ประทับวันที่ / เวลาที่คุณต้องการ
ทิม

3
@ Tim: อาจจะมีเป็นจำนวนมากของข้อมูล
ริชาร์ด

คำตอบ:


75

การใช้-t(สงวนเวลาประทับ) และ--size-onlyจะเปรียบเทียบไฟล์กับขนาดเท่านั้น หากขนาดตรงกัน rsync จะไม่คัดลอกไฟล์ แต่เนื่องจาก-tมีการระบุไว้ไฟล์จะอัปเดตการประทับเวลาในไฟล์ปลายทางโดยไม่ต้องทำการคัดลอกใหม่

ตรวจสอบให้แน่ใจว่าไม่ได้ใช้-u(อัปเดต) เนื่องจากจะเป็นการข้ามไฟล์ที่มีอยู่แล้วและข้ามการอัปเดตเวลาอย่างสมบูรณ์

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

rsync -vrt --size-only /src /dest

2
ฉันยังแนะนำให้เพิ่ม--existingเพื่อป้องกันการคัดลอกไฟล์ใหม่โดยไม่ตั้งใจ
leden

1
ธง--archive(หรือ-a) รวม-r, -tและอื่น ๆ :)
Dor

6

การใช้ - ขนาดเท่านั้นจะทำให้ rsync ข้ามการเปรียบเทียบการประทับเวลาของไฟล์ (และเนื้อหาไฟล์) หากขนาดตรงกัน การรวมสิ่งนี้เข้ากับ - ไทม์สจะทำการเลียนแบบการประทับเวลาข้ามไปยังแผนผังเป้าหมาย


3

ฉันคิดว่า rsync เป็นเครื่องมือที่เหมาะสมในการทำสิ่งนี้ แต่ถ้าคุณต้องการให้สคริปต์ทำสิ่งนี้ได้มากกว่าการบันทึกสิ่งนี้จะเป็นการเริ่มต้นที่ดี

คุณสามารถรับรายการไฟล์ที่มีการประทับเวลา (ตามเวลาที่กำหนด) เช่นนี้:

find . -printf '"%p" %a\n' -type f > /tmp/times

และรับคำสั่งการอัพเดตเวลาที่เหมาะสมจาก:

 while read line; do echo touch -a -d \"${line#* }\" ${line%% *}; done < /tmp/times

มันไม่ใช่สคริปต์ที่สมบูรณ์ แต่เป็นจุดเริ่มต้นที่ดี :)


ขอบคุณ ฉันคิดว่าฉันอาจจะติด Rsync อยู่ครู่หนึ่ง แต่ฉันจะออกไปที่เว็บและเรียนรู้องค์ประกอบต่างๆของสคริปต์ของคุณอย่างแน่นอนเนื่องจากอาจเป็นประโยชน์ในอนาคต
artella

นั่นดูเหมือนจะเป็นทางออกของฉัน! ฉันต้องการรักษาเวลาขณะที่เพิ่มข้อมูลเมตาลงในคลังเพลงของฉัน อย่างไรก็ตามเห็นได้ชัดว่ามันไม่สามารถจัดการช่องว่างในชื่อไฟล์):
Burcardo

2

ใช้ไดเรกทอรีซอร์ส (เช่น/path/to/source) เป็นข้อมูลอ้างอิงสำหรับคำสั่ง touch เพียงcdไปยังไดเรกทอรีเป้าหมายของคุณและทำ

find -type f -exec touch -r /path/to/source/{} {} \;

คุณไม่สามารถคัดลอกการประทับเวลาครั้งที่สองด้วย rsync (ยัง)

นอกจากนี้ยังใช้งานได้กับไดเรกทอรีและไฟล์หลอก (เพียงลบหรือเปลี่ยน-type f)


สิ่งนี้มีประโยชน์สำหรับฉันเนื่องจากฉันต้องการให้คัดลอก atime ฉันสังเกตเห็นว่ามันไม่ได้คัดลอกเวลาซึ่งก็โอเคในกรณีของฉัน
snapfractalpop

เพียงอ่าน manpage ของ 'touch' คุณสามารถตั้งค่า atime และ mtime ได้ด้วยคำสั่งนี้
knorke

ใช่ฉันรู้ว่าคุณสามารถใช้touch -arแต่ก็ยังไม่เปลี่ยนเวลา ฉันคิดว่ามันไม่ค่อยต้องการ
snapfractalpop

อ่าฉันเห็นปัญหาแล้ว ขอบคุณ ใช่เวลาเปลี่ยนยากและฉันไม่รู้ว่าทำไม
knorke

1

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

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


ขอบคุณฉันไม่ทราบคุณสมบัติของ rsync (มีการกล่าวถึงในวิกิพีเดียด้วย)
artella

0

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

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

  1. รักษา timestamps /tmp/filesจะดำเนินการจากไดเรกทอรีปัจจุบันไม่รวมไฟล์ที่ซ่อนอยู่ทั้งหมดและบันทึกไปยังแฟ้มชั่วคราวใน คุณสามารถเปลี่ยนพารามิเตอร์ได้ตลอดเวลา แต่ควรอยู่ให้ดีกว่า-printf '"%t" "%p"\n'เนื่องจากtouchคำสั่งในภายหลังจะใช้สิ่งนั้น

    find . ! -iname ".*" -printf '"%t" "%p"\n' -type f > /tmp/files

  2. แก้ไขไฟล์ของคุณได้มากเท่าที่คุณต้องการ

  3. ตอนนี้สร้างไฟล์ที่ช่วยให้คุณกู้คืนการประทับเวลา:

    while read line; do echo touch -a -d $line >> job.sh; done < /tmp/times

  4. และในที่สุดก็ใช้วันที่เก่ากับไฟล์ที่แก้ไขแล้ว

    sh job.sh

Caveat: ใช้งานได้กับไฟล์ที่มีการเว้นวรรคชื่ออักขระพิเศษ แต่ไม่มีไฟล์ที่มีการ$ลงชื่อเข้าใช้


เพื่อหลีกเลี่ยง (พอใช้) read -r lineปัญหากับเครื่องหมายในชื่อไฟล์ของคุณใช้ ดีเสมอใช้กับread -rนอกจากนี้คุณสามารถหลีกเลี่ยงการเปิดjob.shสำหรับแต่ละไฟล์ เพียงแค่ใส่การเปลี่ยนเส้นทางที่ส่วนท้ายของคำสั่ง:while read -r path; do echo touch -a -d $path ; done < /tmp/times > job.sh
hagello

2nd Caveat: สคริปต์นี้ไม่ถ่ายโอนการประทับเวลาในไดเรกทอรี (อืม OP ไม่ได้ขอให้มัน)
hagello

0

วิธีที่ดีที่สุดในการคัดลอกเฉพาะการประทับเวลาบน Windows:

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

แตะ / c / m / a / r SourceFile DestFile

(Touch รุ่นนี้เป็นส่วนหนึ่งของ Win32 Console ToolBox http://www.stevemiller.net/apps/ )

robocopy "SOURCE_DIRECTORY" "DESTINATION_DIRECTORY" / E / COPYALL / DCOPY: DAT / / R: 10 / W: 5 / V / ETA


-1

คู่มือ rsync: man rsyncแสดง a -tและ-Nswitch พวกเขาอาจจะมีค่าที่เล่นซอ


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