unzip
リモートディレクトリからシェル内のローカルディレクトリに非常に大きなファイルをインポートするシェルスクリプトがあります。これは約20〜30分ほどかなり長い時間がかかります。
#!/bin/sh
…
unzip RemoteHostNFSDirectory -d LocalHostDirectory > output.log
(6.2GBファイルです。)
上記のコマンドを進行状況や砂時計のバーに挿入して、ローカルディレクトリへの抽出が完了したときにユーザーが中断され、正常に完了するとは思わないようにするにはどうすればよいですか。成功または失敗のエラーを印刷できます。
(私はシェルを初めて使うのにご迷惑をおかけして申し訳ありません。)
答え1
予備説明
かかっていないかどうかにかかわらず、「進行状況バーまたは砂時計のバーを表示して、ユーザーがただ掛かっているとは思わないようにする」unzip
ことは本当に簡単です。この回答では、ユーザーを誤解したくないと仮定します。答えはunzip
、ただ虚偽の指標ではなく進行状況を示そうとします。
最も直接的な方法
もしあなたのunzip
標準入力から読めるそして、アーカイブ全体を抽出し、アーカイブを読みながら進行状況を測定しようとしています。
< /path/to/archive.zip pv | unzip -
pv
進捗情報を表示し、データを渡すすべてのツールに置き換えることができます。
その他の一般的な方法
標準入力からデータを読み取ることはできませんが、unzip
アーカイブにファイルが1つだけあり、抽出に使用するファイル名がわかっている場合は、標準出力に抽出して渡してpv
進行状況インジケータを取得します。
unzip -p /path/to/archive.zip | pv > /extracted/name
アーカイブにさらに多くのファイルがある場合は、抽出する個々のファイルを指定する必要があります。
unzip -p /path/to/archive.zip internal/path/to/compressed/file | pv > /extracted/name
単一のファイルを使用して複数のファイルを抽出するunzip -p
と、そのファイルが/extracted/name
。unzip
内部名がわからない場合、unzip -l
または解析が必要ですunzip -v
。このようにpv -s
。
これによりunzip -p
ログを取得できなくなりますunzip
。終了状態によって異なります。何らかの種類のログが必要な場合は、シェルスクリプト自体がログに書き込む必要があります。スクリプトは少なくとも/extracted/name
それを記録できるように知っておく必要があります。
ヒューズ?
何でも期待していますFUSEベースのソリューション通常のファイルをコピーできるすべてのツールを使用できます。進行状況バーはツールによって異なります。コマンドは次のように簡単です。
pv /mountpoint/internal/path/to/compressed/file > /extracted/name
これが必ずしも役に立つわけではありません。私はそれをテストしましたfuse-zip
。実際のコピーツールが機能する前に、抽出(一時ファイルやメモリなど)を実行しているようです。したがって、実際の抽出にはまだ進行状況の表示はありません。選択したツールは、後で抽出したファイルをコピーするように指示できます。 「非常に大きなファイル」をキャッシュするには固有の問題があり、ツールが問題を解決しようとするかどうかはわかりません。fuse-zip
とにかく元の問題を解決できないので問題ありません。
私もそれをテストしましたarchivemount
。進行状況バーはpv
すぐに起動しますが、設定全体が遅すぎます。archivemount
読み込みプロセスが順次読み込まれても、アーカイブ内で前後にジャンプ(探索)する現象があることがわかりました。これは「非常に大きなファイル」には実用的ではないかもしれません。おそらくいくつかの調整が可能です。私が逃したかもしれません。
だまされるpv
賢いですが、やや面倒なアプローチは次のとおりですpv -d
。
unzip /path/to/archive.zip > output.log &
pv -d "$!"
wait "$!"
このアプローチでは、基本的な形式ではユーザーが望むものより多くを表示しますが、「ユーザーが単に停止しているとは思わないように」する必要があります。一部のオプションpv
や「手動」解析と解析を行わない/proc/$!/fd
場合/proc/$!/fdinfo
もpv
役立ちます。
unzip
バックグラウンドで作業すると、ユーザーから簡単に回答できないため、この点に注意してunzip -o
検討してください。
pv
終了後に終了するので、厳密に待ちたい場合にはunzip
そうする必要はありません。終了ステータスを返すことができるかどうか。wait
wait "$!"
unzip