Ketika saya menggunakan zip, bagaimana saya bisa menampilkan keseluruhan kemajuan tanpa membanjiri baris perintah?

25

Bilah kemajuan panjang tetap, jumlah file atau byte, atau lebih baik lagi penghitung waktu yang menunjukkan perkiraan sisa waktu akan ideal.

zipPerilaku standar tampaknya mencetak baris untuk setiap file yang diproses, tetapi saya tidak ingin informasi itu berlebihan ketika saya zip ribuan file. Saya ingin menebak perkiraan berapa lama.

Saya mencoba opsi -q( --quiet) dalam kombinasi dengan -dg( --display-globaldots) tetapi itu hanya membanjiri stdout dengan beberapa garis titik dan tidak memberikan indikasi yang berguna.

Saya juga mencoba -qdgds 10mseperti yang disebutkan di halaman manual, tetapi mendapat hasil yang sama.

Saya kemudian mencoba -db( --display-bytes) dan -dc( --display-counts) tetapi sepertinya tidak ada opsi global, jadi ia mencetaknya lagi untuk setiap nama file.

Terakhir, saya mencobanya bersama dengan -qlike -qdbdc, tapi itu tidak menghasilkan apa-apa.

Lucunya, saya menemukan halaman manual di situs info-zip yang menyebutkan opsi -de( --display-est-to-go) yang seharusnya "Menampilkan perkiraan waktu untuk menyelesaikan operasi pengarsipan."

Kedengarannya persis seperti yang saya inginkan, tetapi masalahnya adalah versi saya ziptidak memiliki fitur itu. Saya menggunakan Ubuntu 14.04.1 64bit, bash-4.3.30 (1) dan zip-3.00. Menurut Wikipedia, ini adalah rilis stabil terbaru zip.

Ada versi beta yang belum dirilis pada halaman info-zip sourceforge, tapi saya lebih suka tidak mempercayakan data saya ke rilis beta.

bug
sumber
Log output ke file dan gunakan untuk memberikan info tingkat tinggi tee. Sebelum memulai zip, buat jumlah total file (dengan lsatau find -type f) dan ketika sedang zip, baca file log untuk jumlah baris file yang diproses yang sudah ada (dengan grepuntuk baris yang tepat untuk melihat, dan wc -luntuk baris hitung), sehingga info tingkat tinggi Anda akan menampilkan sesuatu seperti "234/76438 file yang diproses";
Aquarius Power
Anda dapat mengatur waktunya dengan mempertimbangkan ukuran file total dan memeriksa ukuran file yang sudah diproses; tapi ... bahkan file dengan ukuran yang sama membutuhkan waktu yang berbeda untuk diproses sehingga akan selalu menjadi tebakan liar ...
Aquarius Power
Saya tidak tahu apakah Anda dapat menggunakan stdin saat membuat file ZIP, tetapi jika gzip tidak apa-apa, Anda dapat melakukan sesuatu sepertipv /path/to/file | gzip > /path/to/file.gz
DopeGhoti

Jawaban:

11

zipdapat memampatkan data ke output standar. Karenanya, Anda dapat menggabungkannya dengan alat lain seperti pv:

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

Hapus salah satu -bepopsi sebagai kenyamanan Anda.

pedroapero
sumber
Terima kasih untuk ini! Saya melakukan ini pada mac saya (brew install pv, brew install coreutils, dan ganti du dengan gdu).
Jeff
6

Jika Anda setuju menggunakan 7z:

7z a output.zip folder/

Ini akan memberi Anda bilah kemajuan seperti ini:

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  
qwr
sumber
2

Saya telah berhasil menggunakan yang berikut ini:

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

Dan ini dijelaskan di bawah ini:

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

zip secara rekursif ke dalam [target_zip] file [folder_to_zip] mengarahkan stderr ke stdout. Catatan, stderr itu akan berisi satu baris untuk setiap file dan direktori yang sedang diproses.

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

pipa ke pv baris dengan nama file karena mereka sedang keluaran dari zip. pv dioperasikan dalam mode garis (menghitung kemajuan berdasarkan garis dan ukuran juga dalam jumlah garis yang diharapkan - lihat opsi halaman manual -L PV ).

Ukuran total garis yang diharapkan dikumpulkan dengan mendaftarkan secara berulang (ls) [folder_to_zip] dan menghitung garis yang dimulai dengan '-' atau 'd' yaitu semua file dan direktori (ingat direktori terdaftar dimulai dengan '/') .

Di atas memberikan persentase penyelesaian yang akurat karena 100% tercapai ketika semua file dan direktori telah diproses.

Masalah dengan jawaban pedroapero adalah bahwa kemajuan dihitung pada jumlah byte yang diproses (dikompresi) dari jumlah total byte yang diproses (tidak dikompresi). Akibatnya proses akan selesai sekitar 30% (tergantung pada tingkat kompresi).

Lefteris
sumber