web-dev-qa-db-ja.com

Zipを使用する場合、コマンドラインをあふれさせることなく全体の進行状況を表示するにはどうすればよいですか?

固定長のプログレスバー、ファイルまたはバイトカウント、またはさらに良いことに、推定残り時間を示すタイマーが理想的です。

Zipの標準的な動作は、処理されたすべてのファイルに対して1行を表示するようですが、何千ものファイルをZipするときに、情報が過負荷になりたくありません。どれくらいの時間がかかるかを推測してもらいたい。

-q--quiet)オプションを-dg--display-globaldots)と組み合わせて試しましたが、標準出力が複数行のドットで溢れ、有用な表示がありません。

また、manページに記載されているように-qdgds 10mを試しましたが、同じ結果が得られました。

次に-db--display-bytes)と-dc--display-counts)を試してみましたが、グローバルオプションがないように見えるため、すべてのファイル名に再度出力します。

最後に、-qのように-qdbdcと一緒に試してみましたが、何も出力されません。

おかしなことに、私はinfo-Zipサイトで-de--display-est-to-go)オプションを記載したmanページを見つけました。このオプションは、「アーカイブ操作を完了するまでの推定時間を表示する」必要があります。

それは私が望んでいるように聞こえますが、問題は、私のバージョンのZipにその機能がないことです。私はUbuntu 14.04.1 64ビット、bash-4.3.30(1)、Zip-3.00を使用しています。ウィキペディアによると、これはZipの最新の安定版リリースです。

Info-Zip sourceforgeページには未リリースのベータバージョンがありますが、データをベータリリースに任せたくありません。

26
bug

Zipは、データを標準出力に圧縮できます。したがって、pvのような他のツールと組み合わせることができます。

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

必要に応じて、-bepオプションのいずれかを削除してください。

16
pedroapero

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  
8
qwr

私は以下をうまく使いました:

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 |

Stderrをstdoutにリダイレクトする[folder_to_Zip]ファイルを[target_Zip]ファイルに再帰的に圧縮します。 stderrには、処理中の各ファイルおよびディレクトリごとに1行が含まれることに注意してください。

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

それらがZipから出力されているときに、ファイル名を含む行をpvにパイプします。 pvは行モードで動作します(行とサイズに基づいた進行状況のカウントも予想される行数です- PVのマニュアルページ-lオプション を参照)。

予想される行の合計サイズは、[folder_to_Zip]を再帰的にリスト(ls)し、「-」または「d」で始まる行を数えることで収集されます。つまり、allファイルとディレクトリ(ディレクトリは「/')

上記は、すべてのファイルとディレクトリが処理されたときに100%に到達するため、正確な完了率を提供します。

Pedroaperoの答えの問題は、処理される(圧縮されていない)合計バイト数に対して処理された(圧縮された)バイト数で進行状況が計算されることです。結果として、プロセスは約30%で完了します(圧縮率によって異なります)。

2
Lefteris