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

运行this会出现进度条,从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 生成一个子shell并COMMAND1在其中运行。
  3. (COMMAND2 &) 生成另一个将COMMAND2在后台启动的子shell。
  4. 尽管 :; 开始一个无限循环。
  5. tail FILE读取最后 10 行FILE.
  6. grep -o仅打印匹配行的匹配(非空)部分。
  7. [0-9]*%后跟 % 符号的任意数字序列。
  8. tail -1读取上一个管道命令的最后一行。
于 2012-12-21T21:20:53.747 回答
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您需要 cd 在您想要 7z-Backup 中目录结构的文件夹中,否则 7z 不会在存档中放置目录结构。

  2. export number_of_files=$(find folder_to_backup -type f | wc -l)首先计算要压缩的文件并导出变量以供以后计算。

  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 压缩" \; 为查找输出的每一行启动一个子shell,并使用管道执行 7z 到 grep。

  5. awk -W interactive -vx="$number_of_lines" '{printf "%d\n", (NR*100/x)}'提示awk要交互(-W交互),传播之前导出的变量(-vx= "$number_of_lines"),最后计算并打印百分比('{printf "%d\n", (NR*100/x)')。

  6. 将所有这些放在括号中,然后将管道放入 zenity。

于 2013-09-11T10:51:45.047 回答
1

问题不在于zenity。这是因为 7z 不写入标准输出。(可能使用 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

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

于 2015-03-14T07:00:17.217 回答