Khi tôi sử dụng zip, làm cách nào tôi có thể hiển thị tiến trình tổng thể mà không làm ngập dòng lệnh?


25

Thanh tiến trình có độ dài cố định, số tệp hoặc số byte hoặc tốt hơn là bộ hẹn giờ hiển thị thời gian ước tính còn lại sẽ là lý tưởng.

zipHành vi tiêu chuẩn của dường như là in một dòng cho mỗi tệp được xử lý, nhưng tôi không muốn thông tin đó bị quá tải khi tôi nén hàng nghìn tệp. Tôi muốn dự đoán sẽ mất bao lâu.

Tôi đã thử tùy chọn -q( --quiet) kết hợp với -dg( --display-globaldots) nhưng điều đó chỉ làm tràn ngập thiết bị xuất chuẩn với nhiều dòng dấu chấm và không đưa ra dấu hiệu hữu ích nào.

Tôi cũng đã thử -qdgds 10mnhư được đề cập trong trang người đàn ông, nhưng nhận được kết quả tương tự.

Sau đó tôi đã thử -db( --display-bytes) và -dc( --display-counts) nhưng dường như không có tùy chọn toàn cầu, vì vậy nó lại in nó cho mỗi tên tệp.

Cuối cùng, tôi đã thử nó cùng với -qlike -qdbdc, nhưng điều đó không mang lại kết quả gì.

Thật thú vị, tôi đã tìm thấy một trang người đàn ông trên trang web thông tin có đề cập đến một tùy chọn -de( --display-est-to-go) sẽ "Hiển thị ước tính thời gian để hoàn thành thao tác lưu trữ."

Nghe có vẻ chính xác như những gì tôi muốn, nhưng vấn đề là phiên bản của ziptôi không có tính năng đó. Tôi đang sử dụng Ubuntu 14.04.1 64 bit, bash-4.3.30 (1) và zip-3.00. Theo Wikipedia, đây là bản phát hành ổn định mới nhất của zip.

Có các phiên bản beta chưa được phát hành trên trang sourceforge, nhưng tôi không muốn giao dữ liệu của mình cho bản phát hành beta.


Đăng nhập đầu ra vào một tệp và sử dụng nó để cung cấp thông tin cấp cao với tee. Trước khi bắt đầu zip, hãy tạo tổng số tệp (có lshoặc find -type f) và trong khi nén, hãy đọc tệp nhật ký để biết số dòng tệp đã xử lý mà nó đã có (với grepcác dòng bên phải để xem và wc -lcho các dòng đếm), vì vậy thông tin cấp cao của bạn sẽ hiển thị nội dung như "234/76438 tệp được xử lý";
Sức mạnh Bảo Bình

bạn có thể xử lý thời gian bằng cách xem xét tổng kích thước tệp và kiểm tra kích thước của các tệp đã được xử lý; nhưng ... ngay cả các tệp có cùng kích thước cũng mất nhiều thời gian để xử lý, vì vậy nó sẽ luôn là một phỏng đoán hoang dã ...
Sức mạnh của Bảo Bình

Tôi không biết liệu bạn có thể sử dụng stdin khi tạo tệp ZIP hay không, nhưng nếu gzip vẫn ổn, bạn có thể làm một cái gì đó nhưpv /path/to/file | gzip > /path/to/file.gz
DopeGhoti

Câu trả lời:


11

zipcó thể nén dữ liệu để đầu ra tiêu chuẩn. Do đó, bạn có thể kết hợp nó với các công cụ khác như pv:

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

Xóa một trong các -beptùy chọn là thuận tiện cho bạn.


Cảm ơn vì điều đó! Tôi làm điều này trên máy mac của mình (brew install pv, brew install coreutils và thay thế bằng gdu).
Jeff

6

Nếu bạn ổn với việc sử dụng 7z:

7z a output.zip folder/

Điều này sẽ cung cấp cho bạn một thanh tiến trình như thế này:

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

Tôi đã sử dụng thành công như sau:

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

Và điều này được giải thích dưới đây:

zip -r [target_zip] [thư mục_to_zip] 2> & 1 |

zip đệ quy vào [target_zip] tệp [thư mục_to_zip] chuyển hướng stderr sang thiết bị xuất chuẩn. Lưu ý, stderr đó sẽ chứa một dòng cho mỗi tệp và thư mục đang được xử lý.

pv -lep -s $ (ls -Ral1 [thư mục_to_zip] | egrep -c '^ [- /]')> / dev / null

dẫn vào pv các dòng có tên tệp khi chúng được xuất ra từ zip. pv được vận hành ở chế độ dòng (đếm tiến trình dựa trên các dòng và kích thước cũng theo số lượng dòng mong đợi - xem tùy chọn PV man page -l ).

Tổng kích thước của các dòng mong đợi được thu thập bằng cách liệt kê đệ quy (ls) [thư mục_to_zip] và đếm các dòng bắt đầu bằng '-' hoặc 'd' tức là tất cả các tệp và thư mục (ghi nhớ các thư mục được liệt kê bắt đầu bằng '/') .

Ở trên cung cấp tỷ lệ phần trăm hoàn thành chính xác vì đạt được 100% khi tất cả các tệp và thư mục đã được xử lý.

Vấn đề với câu trả lời của pedroapero là tiến trình được tính trên số byte được xử lý (nén) trên tổng số byte cần xử lý (không nén). Kết quả là quá trình sẽ hoàn thành ở mức khoảng 30% (tùy thuộc vào tốc độ nén).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.