如何将值发送到Zenity进度条

时间:2012-12-21 17:48:54

标签: linux shell progress-bar zenity

我编写了一个使用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 个答案:

答案 0 :(得分: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 生成子shell并在其中运行COMMAND1
  3. (COMMAND2&)生成另一个将在后台启动COMMAND2的子shell。
  4. while:; 启动无限循环。
  5. 尾部文件阅读FILE的最后10行。
  6. grep -o 仅打印匹配行的匹配(非空)部分。
  7. [0-9] *%任何一系列数字后跟%符号。
  8. tail -1 读取上一个管道命令的最后一行。

答案 1 :(得分:4)

没有临时文件创建的解决方案

最后,我在遭受重击和一些流鼻血之后得到了它......

线索是,互动与非互动缓冲: 交互式程序通常对其输出进行缓冲;也就是说,他们写出每一行。非交互式程序会等到它们有一个完整的缓冲区,这可能是多行输出。 现在,如果将非交互式程序传输到另一个程序,则第二个程序在第一个程序写出完整缓冲区之前不会得到它的输入。

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 = $(查找folder_to_backup -type f | wc -l)首先计算要压缩的文件并导出变量以供日后计算。

  3. 查找folder_to_backup -print0 -type f folder_to_backup必须是相对路径。 (见1.)

  4. -exec sh -c“7z a -t7z /path/to/Backup.7z {} -mx9 -bd | grep压缩”\; 为每行查找启动子shell用管道输出并执行7z到grep。

  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. 将所有这些放在括号中,将管道放在zenity中。

答案 2 :(得分: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

答案 3 :(得分:0)

您将需要一个带代码的子shell,以某种方式监视压缩,例如在完成时匹配文件大小与预期大小,并回显一个百分比。将子shell放在正在进行压缩的子shell中。访问http://user.cavenet.com/rolandl并查看ftp-user.txt以获取示例。 Bash子弹很方便!