เมื่อฉันใช้ zip ฉันจะแสดงความคืบหน้าโดยรวมได้อย่างไรโดยไม่ทำให้บรรทัดคำสั่งท่วมท้น?


25

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

zipพฤติกรรมมาตรฐานของดูเหมือนจะพิมพ์บรรทัดสำหรับทุกไฟล์ที่ประมวลผล แต่ฉันไม่ต้องการให้ข้อมูลมากเกินไปเมื่อฉันซิปไฟล์หลายพันไฟล์ ฉันต้องการเดาว่ามันจะใช้เวลานานแค่ไหน

ฉันลองใช้ตัวเลือก-q( --quiet) ร่วมกับ-dg( --display-globaldots) แต่นั่นก็ทำให้ stdout เต็มไปด้วยจุดหลายบรรทัดและไม่แสดงสิ่งที่มีประโยชน์

ฉันพยายาม-qdgds 10mตามที่กล่าวไว้ในหน้า man แต่ได้ผลลัพธ์เดียวกัน

ฉันลองแล้ว-db( --display-bytes) และ-dc( --display-counts) แต่ดูเหมือนจะไม่มีตัวเลือกระดับโลกดังนั้นจึงพิมพ์ใหม่สำหรับชื่อไฟล์ทุกชื่อ

สุดท้ายฉันพยายามมันด้วยกัน-qเหมือน-qdbdcแต่เพียงว่าไม่มีอะไรที่เอาท์พุท

สนุกพอฉันพบหน้าคนในเว็บไซต์ info-zip ที่กล่าวถึงตัวเลือก-de( --display-est-to-go) ซึ่งควรจะ "แสดงเวลาโดยประมาณเพื่อให้การดำเนินการเก็บถาวรเสร็จสิ้น"

ฟังดูเหมือนสิ่งที่ฉันต้องการ แต่ปัญหาคือเวอร์ชั่นของฉันzipไม่มีคุณสมบัตินั้น ฉันใช้ Ubuntu 14.04.1 64 บิต, bash-4.3.30 (1) และ zip-3.00 ตาม Wikipedia นี่เป็นรุ่นล่าสุดที่เสถียรของ zip

มีรุ่นเบต้าที่ยังไม่เผยแพร่ในหน้าแหล่งข้อมูล info-zip แต่ฉันไม่อยากมอบข้อมูลของฉันให้เป็นรุ่นเบต้า


teeเข้าสู่ระบบการส่งออกไปยังแฟ้มและใช้มันเพื่อให้ข้อมูลในระดับสูงด้วย ก่อนที่จะเริ่ม zip ให้ทำการนับจำนวนไฟล์ทั้งหมด (ด้วยlsหรือfind -type f) และในขณะที่ซิปให้อ่านไฟล์บันทึกสำหรับจำนวนบรรทัดของไฟล์ที่ถูกประมวลผลที่มีอยู่แล้ว ( grepสำหรับบรรทัดที่ถูกต้องเพื่อดูและwc -lสำหรับบรรทัด นับ) ดังนั้นข้อมูลระดับสูงของคุณจะแสดงบางอย่างเช่น "234/76438 ไฟล์ที่ประมวลผล";
กุมภ์กำลัง

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

ฉันไม่รู้ว่าคุณสามารถใช้ stdin เมื่อสร้างไฟล์ ZIP ได้หรือไม่ แต่ถ้า gzip ไม่เป็นไรคุณสามารถทำสิ่งต่าง ๆ ได้เช่นกันpv /path/to/file | gzip > /path/to/file.gz
DopeGhoti

คำตอบ:


11

zipสามารถบีบอัดข้อมูลไปยังเอาต์พุตมาตรฐาน ดังนั้นคุณสามารถรวมเข้ากับเครื่องมืออื่น ๆ เช่นpv:

zip -qr - [folder] | pv -bep -s $(du -bs [folder] | awk '{print $1}') > [file.zip]

ลบหนึ่งใน-bepตัวเลือกตามความสะดวกของคุณ


ขอบคุณสำหรับสิ่งนี้! ฉันทำสิ่งนี้บน mac ของฉัน (ชงติดตั้ง pv, ชงติดตั้ง coreutils และแทนที่ du ด้วย gdu)
Jeff

6

หากคุณตกลงกับการใช้ 7z:

7z a output.zip folder/

สิ่งนี้จะให้แถบความคืบหน้าแก่คุณดังนี้:

Open archive: test.zip
--
Path = test.zip
Type = zip
Physical Size = 232039663

Scanning the drive:
3 folders, 2401 files, 238122225 bytes (228 MiB)

Updating archive: test.zip

Items to compress: 2404

 16% 279 U folder/file.txt  

2

ฉันใช้ต่อไปนี้สำเร็จแล้ว:

zip -r [target_zip] [folder_to_zip] 2>&1 | 
pv -lep -s $(ls -Rl1 [folder_to_zip] | egrep -c '^[-/]') > /dev/null

และนี่คือคำอธิบายด้านล่าง:

zip -r [target_zip] [folder_to_zip] 2> & 1 |

zip ซ้ำไปที่ [target_zip] ไฟล์ [folder_to_zip] เปลี่ยนเส้นทาง stderr ไปยัง stdout หมายเหตุ stderr นั้นจะมีหนึ่งบรรทัดสำหรับแต่ละไฟล์และไดเรกทอรีที่กำลังประมวลผล

pv -lep -s $ (ls -Ral1 [folder_to_zip] | egrep -c '^ [- /]')> / dev / null

ไปป์ pv ที่บรรทัดด้วยชื่อไฟล์เนื่องจากกำลังถูกส่งออกจาก zip pv ทำงานในโหมดบรรทัด (ความคืบหน้าการนับตามบรรทัดและขนาดเป็นจำนวนบรรทัดที่คาดหวัง - ดูตัวเลือก PV man page -l )

ขนาดรวมของสายที่จะคาดหวังว่าจะถูกรวบรวมโดยซ้ำรายการ (LS) [การ folder_to_zip] และนับเส้นที่เริ่มต้นด้วย '-' หรือ 'D' คือทุกไฟล์และไดเรกทอรี (จำไดเรกทอรีมีการระบุไว้เริ่มต้นด้วย '/')

ข้อมูลข้างต้นแสดงเปอร์เซ็นต์ความสำเร็จที่แม่นยำเมื่อถึง 100% เมื่อประมวลผลไฟล์และไดเรกทอรีทั้งหมด

ปัญหาเกี่ยวกับคำตอบของ pedroapero คือความคืบหน้าจะคำนวณตามจำนวนไบต์ที่ประมวลผล (บีบอัด) บนจำนวนไบต์ทั้งหมดที่ประมวลผล (ไม่บีบอัด) ดังนั้นกระบวนการจะเสร็จสมบูรณ์ประมาณ 30% (ขึ้นอยู่กับอัตราการบีบอัด)

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