7

7zip を使用してディレクトリをバックアップする簡単なスクリプトを作成しました。すべてが機能しますが、進行状況バーを追加して、グラフィカルなフィードバックを追加したいと思いました。これでできることはわかっていますzenityが、何を試してもうまくいかないようです。

バーを増やすために、新しいファイルがいつ圧縮されているかを調べるために使用fgrepしています(「圧縮中」は、7zipによって画面に出力されるすべての行の最初の単語です)。具体的なコード行は次のとおりです。

7z a -t7z /home/user/Desktop/Backup.7z /home/user/Desktop/folder_to_backup -mx9 | fgrep Compressing | nl | awk '{print $1/$number_of_files*100}' | zenity --progress --percentage=0 --auto-close

これを実行すると、0 から始まる進行状況バーが表示されますが、進行状況は表示されません。操作が完了すると、バーが突然最後までジャンプします。

私はこれをしばらくグーグルで調べましたが、私が見つけた唯一のことは、zenity progressいくつかの問題があるように見えるということです:D どんな助けでも大歓迎です!

4

4 に答える 4

5

出力でコマンドの進行状況を取得していないようです| zenity --progress --percentage=0 --auto-close。パイプなしでコマンドを実行して確認してください。

apt-get install screen出力を取得するには、次のようなことを試してください。インストールしていない場合は、最初に必要です。

screen -L bash -c '(while :; do tail ~/screenlog.0 | grep -o "[0-9]*%" | tail -1; done | zenity --progress --auto-close &); 7z a "output.zip" "/path/to/input"'

コマンドの最も重要な部分を分解します。

  1. screen -Lこのフラグは、デフォルトscreenで、新しいセッションを開始し、すべての端末出力をファイルに記録するようにコマンドに指示~/screenlog.0します。
  2. bash -c COMMAND1サブシェルを生成して実行COMMAND1します。
  3. (COMMAND2 &)バックグラウンドで起動する別のサブシェルを生成COMMAND2します。
  4. その間 :; 無限ループを開始します。
  5. tail FILEの最後の 10 行を読み取りFILEます。
  6. grep -o一致する行の一致した (空でない) 部分のみを出力します。
  7. [0-9]*%任意の一連の数字の後に % 記号が続きます。
  8. tail -1前のパイプ コマンドの最後の行を読み取ります。
于 2012-12-21T21:20:53.747 に答える
4

一時ファイルを作成しないソリューション

最後に、頭痛と鼻血の後にそれを手に入れました...

手がかりは、対話型と非対話型のバッファリングです。対話型プログラムは通常、出力を行バッファリングします。つまり、すべての行を書き出します。非対話型プログラムは、バッファーがいっぱいになるまで待機します。これは、多くの行の出力になる可能性があります。ここで、非対話型プログラムを別のプログラムにパイプすると、最初のプログラムが完全なバッファーを書き出す前に、2 番目のプログラムが入力を取得します。

cd /home/user
export number_of_files=$(find folder_to_backup -type f | wc -l) && ( find folder_to_backup -print0 -type f -exec sh -c "7z a -t7z /path/to/Backup.7z {} -mx9 -bd | grep Compressing" \; | awk -W interactive -v x="$number_of_lines" '{printf "%d\n", (NR*100/x)}' ) | zenity --progress --percentage=0 --auto-close

説明する必要があるかもしれません:

  1. cd /home/user 7z-Backup のディレクトリ構造が必要な場所からフォルダに cd する必要があります。そうしないと、7z はアーカイブにディレクトリ構造を配置しません。

  2. export number_of_files=$(find folder_to_backup -type f | wc -l)最初に zip するファイルをカウントし、後で計算するために変数をエクスポートします。

  3. find folder_to_backup -print0 -type f folder_to_backupは相対パスでなければなりません。(1を参照してください。)

  4. -exec sh -c "7z a -t7z /path/to/Backup.7z {} -mx9 -bd | grep 圧縮中" \; find が出力するすべての行に対してサブシェルを開始し、grep へのパイプを使用して 7z を実行します。

  5. awk -W interactive -vx="$number_of_lines" '{printf "%d\n", (NR*100/x)}' awk をインタラクティブにするよう促し (-W interactive)、以前にエクスポートした変数を伝播します (-vx= "$number_of_lines")、最後にパーセンテージを計算して出力します ('{printf "%d\n", (NR*100/x)')。

  6. これらすべてを括弧に入れ、パイプをゼニティに入れます。

于 2013-09-11T10:51:45.047 に答える
1

問題はゼニティではありません。これは、7z が stdout に書き込まないためです。(おそらく、tput または同様のコマンドを使用して、端末を直接処理します)。したがって、別のコマンドにパイプすることはできません。

コマンドをファイルにリダイレクトすると、実際にこれを確認できます。

 7z a -t7z /home/user/Desktop/Backup.7z /home/user/Desktop/folder_to_backup -mx9 | fgrep Compressing | nl | awk '{print $1}' > 7z.stdout

私のバージョンの 7z では、ファイルは次のようになります。

7-Zip [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_CA.UTF-8,Utf16=on,HugeFiles=on,4 CPUs)

Scanning

Updating archive test.7z

Compressing  test.file

Everything is Ok
于 2012-12-21T23:27:01.053 に答える
0

何らかの方法で圧縮を監視するためのコードを含むサブシェルが必要になります。たとえば、ファイルサイズを完了時に予想されるサイズと一致させ、パーセンテージをエコーし​​ます。そのサブシェルを、圧縮を行っているサブシェル内に配置します。http://user.cavenet.com/rolandlにアクセスして、例として ftp-user.txt をチェックしてください。Bash サブシェルは非常に便利です。

于 2015-03-14T07:00:17.217 に答える