ข้อมูลความคืบหน้าผ่าน pv สำหรับการคัดลอกไดเรกทอรี


14

ฉันต้องการคัดลอกไดเรกทอรีที่มีขนาดใหญ่มาก (พูดคุยเป็นเทราไบต์ที่นี่) และต้องการติดตามความคืบหน้า

ฉันพบว่าpvเป็นอรรถประโยชน์ที่ดี แต่ฉันจะใช้มันเพื่อคัดลอกไดเรกทอรีซ้ำได้อย่างไร ( pv src > dstไม่ทำงานเพราะเป็นไดเรกทอรี)

PS: ทำงานบน OS X Mountain Lion pvถูกติดตั้งจาก Mac Ports

คำตอบ:


21

ใช้ rsync --progress [SRC] [DST]

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

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


เหตุใดการคัดลอกผ่านไพพ์จึงทำให้กระบวนการช้าลง การบัฟเฟอร์จากท่อและการทำงานหลายอย่างที่เกี่ยวข้องกับท่อมีแนวโน้มที่จะช่วยเรื่องที่ฉันจะพูด (และ rsync เป็นหลายกระบวนการและใช้ไพพ์ภายใน IIRC) กระบวนการคัดลอกที่ไม่ใช้ไฟล์คืออะไร
Stéphane Chazelas

ทุบตีสะดวก แต่ไม่เร็ว โดยเฉพาะอย่างยิ่งเมื่อทำการไพพ์คำสั่งหนึ่งไปยังอีกคำสั่งหนึ่ง
jippie

@StephaneChazelas: เนื่องจากบัฟเฟอร์ของไปป์นั้นมีเพียง 8KB โปรแกรมอย่าง rsync อาจต้องการใช้บัฟเฟอร์ภายในที่ใหญ่กว่ามาก
Zan Lynx

10

คุณสามารถใช้tarหรือpaxหรือcpio:

mkdir -p dst &&
  (cd src && tar cf - .) | pv -trb | (cd dst && tar xpf -)

1
นอกจากนี้คุณอาจเพิ่มvไปยังtarคำสั่งเพื่อดูชื่อไฟล์
เตอร์

ดังนั้นนี่จะซิปโฟลเดอร์ซอร์สก่อนทำการคัดลอกใช่ไหม โฟลเดอร์ของฉันมีขนาด 5 TB ดังนั้นฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดใช่ไหม? ฉันชอบใช้ pv มากเพราะมันแสดงสถานะความก้าวหน้าที่ดีจริงๆมีคำแนะนำอะไรมั้ย
ตาก

@ รับไม่มันไม่ได้บีบอะไรเลยเพราะไม่มีการบีบอัด tar cf -เอาต์พุตสตรีมที่มีไฟล์และข้อมูลเมตาของพวกเขาซึ่งถูกป้อนผ่านไพพ์ไปยัง pv ซึ่งฟีดมันจะไม่ถูกแตะต้องในtarขณะที่พิมพ์ตัวบ่งชี้ความคืบหน้าและอีกอันจะtarแยกข้อมูลในสตรีมนั้น ทั้งสามคำสั่งทำงานพร้อมกันและประมวลผลข้อมูลตามที่มาไม่มีสิ่งใดที่เก็บไว้ในดิสก์ไม่มีอะไรเก็บไว้ในหน่วยความจำอื่นนอกเหนือจากไพพ์บัฟเฟอร์และคำสั่งบัฟเฟอร์ภายในซึ่งเพียงไม่กี่กิโลไบต์
Stéphane Chazelas

@ StéphaneChazelasขอบคุณสำหรับความคิดเห็น ฉันได้ลองแล้วมันใช้งานได้สิ่งเดียวคือแถบความคืบหน้าจะไม่แสดงเปอร์เซ็นต์ที่คาดหวังไว้จากซ้ายไปขวา มีความคิดอะไรบ้าง ฉันใช้ pv กับพารามิเตอร์นี้ -petra ซึ่งมักจะแสดงแถบความคืบหน้าซึ่งแถบนั้นจะถูกเติมจนกว่าจะเสร็จสิ้น ฉัน upvoted คำตอบของคุณเช่นกัน
ตาก

@Tak pvไม่มีวิธีที่จะรู้ว่ามีการถ่ายโอนข้อมูลเท่าไหร่ หากคุณมีการประมาณจำนวนเงินนั้นคุณสามารถส่งไปให้พร้อมกับ-sตัวเลือก (GNU du -sb srcจะให้การประมาณที่ดีถ้าไฟล์มีขนาดใหญ่พอ)
Stéphane Chazelas


1

นี่คือคำสั่งบางส่วนที่จะคัดลอกไดเรกทอรีด้วยข้อมูลความคืบหน้า


หากมีไฟล์ขนาดเล็กจำนวนมาก:

cp -av sourcedir targetdir | pv -l -s filecount > logfile

สิ่งนี้จะรายงานความคืบหน้าตามจำนวนไฟล์ที่คัดลอก

คุณสามารถเปลี่ยนเส้นทางไปถ้าคุณไม่จำเป็นที่จะต้อง/dev/nulllogfile

ใช้คำสั่งต่อไปนี้เพื่อรับfilecount:

find sourcedir | wc -l

หากมีไฟล์ขนาดใหญ่จำนวนน้อย:

tar c sourcedir | pv -s size | tar x -C targetdir

สิ่งนี้จะรายงานความคืบหน้าตามจำนวนไบต์ที่ถูกคัดลอก

targetdir ต้องมีอยู่จริง

ใช้คำสั่งต่อไปนี้เพื่อรับsize:

du -sh sourcedir

หากคุณต้องการใช้ rsync:

rsync -ai sourcedir/ targetdir/ | pv -l -s filecount > logfile

รับfilecountตามที่แสดงด้านบน

หากคุณกำลังคัดลอกบนระบบเดียวกันแล้วเป็นจริงเช่นเดียวกับrsync -a cp -aข้อดีของ rsync คือเมื่อคุณคัดลอกผ่านเครือข่ายหรือหากคุณกำลังปรับปรุง (หรือเปรียบเทียบ) สำเนาก่อนหน้า

ดูที่นี่สำหรับรายละเอียดเพิ่มเติม:


0

คุณสามารถทำdu -b /directory/ทั้งบนต้นทางและปลายทางในขณะที่คำสั่งคัดลอกปกติอยู่ในระหว่างดำเนินการและเปรียบเทียบทั้งสอง นี่เป็นวิธีที่มีประสิทธิภาพและไม่ทำให้กระบวนการคัดลอกช้าลงโดยการผลักผ่านท่อ


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