Linux 带进度条的 adb 推/拉

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6595374/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-05 04:57:30  来源:igfitidea点击:

adb push/pull with progress bar

androidlinuxprogress-baradb

提问by darkwings

It is really annoying if you adb push/pull large files to the device that there's no way to now how far along it is. Is it possible to run adb push or adb pull and get a progress bar using the 'bar' utility?

如果您将大文件 adb 推/拉到设备,现在无法到达多远,这真的很烦人。是否可以运行 adb push 或 adb pull 并使用“bar”实用程序获取进度条?

The main issue here is I think that adb expects two file names, if the input file could be replaced by stdin you could pipe through the 'bar' utility and get a progress bar. So far I haven't succeeded in doing so, but I'm not really a shell guru which is why I'm asking here :)

这里的主要问题是我认为 adb 需要两个文件名,如果输入文件可以被 stdin 替换,您可以通过“bar”实用程序进行管道传输并获得进度条。到目前为止,我还没有成功做到这一点,但我并不是真正的 shell 大师,这就是我在这里问的原因:)

Note that I'm on Linux using bash.

请注意,我在 Linux 上使用 bash。

回答by joecks

Well I can give you an Idea:

那么我可以给你一个想法:

ADB_TRACE=adb adb push <source> <destination> 

returns logs for any command, so for example the copy command, which looks like:

返回任何命令的日志,例如复制命令,它看起来像:

writex: fd=3 len=65544: 4441544100000100000000021efd  DATA....#....b..

here you can get the total bytes length before, with ls -a, then parse the output of adb with grep or awk, increment an interneral counter and send the current progress to the bar utility.

在这里,您可以使用 ls -a 获得之前的总字节长度,然后使用 grep 或 awk 解析 adb 的输出,增加内部计数器并将当前进度发送到 bar 实用程序。

When you succeeded, please post the script here.

成功后,请在此处发布脚本。

回答by darkwings

Currently I have this little piece of bash:

目前我有这个小块bash:

function adb_push {
  # NOTE: 65544 is the max size adb seems to transfer in one go
  TOTALSIZE=$(ls -Rl "" | awk '{ sum += sprintf("%.0f\n", ( / 65544)+0.5) } END { print sum }')
  exp=$(($TOTALSIZE * 7)) # 7 bytes for every line we print - not really accurate if there's a lot of small files :(
  # start bar in the background
  ADB_TRACE=adb adb push "" "" 2>&1 | unbuffer -p awk '/DATA/ { split(,a,"="); print a[2] }' | unbuffer -p cut -d":" -s -f1 | unbuffer -p bar -of /dev/null -s $exp
  echo  # Add a newline after the progressbar.
}

It works somewhat, it shows a progress bar going from 0 to 100 which is nice. However, it won't be correct if you do a lot of small files, and worse, the bytes/s and total bytes shown by 'bar' aren't correct.

它有点作用,它显示了一个从 0 到 100 的进度条,这很好。但是,如果你做很多小文件,它就不会正确,更糟糕的是,'bar' 显示的字节/秒和总字节不正确。

I challenge you to improve on my script; it shouldn't be hard! ;)

我挑战你改进我的剧本;应该不难!;)

回答by nuclearmistake

QtADB has both per-file and total progress bars. http://qtadb.wordpress.com/

QtADB 有每个文件和总进度条。http://qtadb.wordpress.com/

回答by user3408864

I made a patch to adb to fix this.

我为 adb 做了一个补丁来解决这个问题。

https://android-review.googlesource.com/#/c/87748

https://android-review.googlesource.com/#/c/87748

回答by chx

I found a Python pastebinwhich is incomplete but close: it needs a \rand arguments support.

我发现了一个不完整但很接近的 Python pastebin:它需要 a\r和 arguments 支持。

回答by alijandro

Here is my solution, it will show a simple progressbar and current numeric progress

这是我的解决方案,它将显示一个简单的进度条和当前的数字进度

[==================================================] 100%

Usage

用法

./progress_adb.sh source destination

progress_adb.sh

progress_adb.sh

#!/bin/bash

function usage()
{
    echo "
$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
source destination" exit 1 } function progressbar() { bar="==================================================" barlength=${#bar} n=$((*barlength/100)) printf "\r[%-${barlength}s] %d%%" "${bar:0:n}" "" # echo -ne "\b" } export -f progressbar [[ $# < 2 ]] && usage SRC= DST= [ ! -f $SRC ] && { \ echo "source file not found"; \ exit 2; \ } which adb >/dev/null 2>&1 || { \ echo "adb doesn't exist in your path"; \ exit 3; \ } SIZE=$(ls -l $SRC | awk '{print }') ADB_TRACE=adb adb push $SRC $DST 2>&1 \ | sed -n '/DATA/p' \ | awk -v T=$SIZE 'BEGIN{FS="[=:]"}{t+=;system("progressbar " sprintf("%d\n", t/T*100))}' echo

Testing on Ubuntu 14.04

在 Ubuntu 14.04 上测试

Android Debug Bridge version 1.0.32
device commands:
adb push [-p] <local> <remote>
    - copy file/dir to device
    ('-p' to display the transfer progress)

TODO

去做

directory support

目录支持

progressbar size change when screen size change

屏幕大小更改时进度条大小更改

回答by jpage4500

It looks like the latest adb has progress support.

看起来最新的 adb 有进度支持。

#!/bin/bash
# adb install with progressbar displayed
# usage: <adb-install.sh> <file.apk>
# original code from: http://stackoverflow.com/questions/6595374/adb-push-pull-with-progress-bar

function usage()
{
    echo "##代码## <apk to install>"
    exit 1
}

function progressbar()
{
    bar="================================================================================"
    barlength=${#bar}
    n=$((*barlength/100))
    printf "\r[%-${barlength}s] %d%%" "${bar:0:n}" ""
    # echo -ne "\b"
}

export -f progressbar

[[ $# < 1 ]] && usage

SRC=

[ ! -f $SRC ] && { \
    echo "source file not found"; \
    exit 2; \
}

which adb >/dev/null 2>&1 || { \
    echo "adb doesn't exist in your path"; \
    exit 3; \
}

SIZE=$(ls -l $SRC | awk '{print }')
export ADB_TRACE=all

adb install -r $SRC 2>&1 \
    | sed -n '/DATA/p' \
    | awk -v T=$SIZE 'BEGIN{FS="[=:]"}{t+=;system("progressbar " sprintf("%d\n", t/T*100))}'

export ADB_TRACE=

echo

echo 'press any key'
read n

However, the answers above also work for 'adb install' which do not have a progress option. I modified the first answer's script to work this way:

但是,上面的答案也适用于没有进度选项的“adb install”。我修改了第一个答案的脚本以这样工作:

Create "adb-install.sh" somewhere in your PATH and run "adb-install.sh " instead of "adb install -f "

在路径中的某处创建“adb-install.sh”并运行“adb-install.sh”而不是“adb install -f”

##代码##