linux 带进度条的adb推/拉

wnavrhmk  于 2023-03-07  发布在  Linux
关注(0)|答案(4)|浏览(239)

如果你用adb推送/拉取大文件到设备上,那就很烦人了,因为你无法知道沿着多远。有没有可能运行adb推送或adb拉取,然后用“bar”工具得到一个进度条?
这里的主要问题是我认为adb需要两个文件名,如果输入文件可以被stdin代替,你可以通过'bar'工具得到一个进度条。到目前为止,我还没有成功做到这一点,但我不是一个真正的shell大师,这就是为什么我在这里问:)
注意,我在Linux上使用的是bash。

7fyelxc5

7fyelxc51#

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

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)

然而,上面的答案也适用于没有进度选项的adb install。我修改了第一个答案的脚本,使其工作方式如下:
PATH中的某个位置创建adb-install.sh,并运行adb-install.sh <apk to install>而不是adb install -f <apk to install>

#!/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 "$0 <apk to install>"
    exit 1
}

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

export -f progressbar

[[ $# < 1 ]] && usage

SRC=$1

[ ! -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 $5}')
export ADB_TRACE=all

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

export ADB_TRACE=

echo

echo 'press any key'
read n
fsi0uk1n

fsi0uk1n2#

现在我有一个小小的抨击:

function adb_push {
  # NOTE: 65544 is the max size adb seems to transfer in one go
  TOTALSIZE=$(ls -Rl "$1" | awk '{ sum += sprintf("%.0f\n", ($5 / 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 "$1" "$2" 2>&1 | unbuffer -p awk '/DATA/ { split($3,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.
}

它可以工作,它显示一个从0到100的进度条,这很不错。但是,如果你处理很多小文件,它就不正确了,更糟糕的是,“bar”显示的字节/秒和总字节数不正确。
我要求你改进我的剧本这应该不难!)

xbp102n0

xbp102n03#

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

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

用途

./progress_adb.sh source destination

progress_adb.sh

#!/bin/bash

function usage()
{
    echo "$0 source destination"
    exit 1
}

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

export -f progressbar

[[ $# < 2 ]] && usage

SRC=$1
DST=$2

[ ! -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 $5}')
ADB_TRACE=adb adb push $SRC $DST 2>&1 \
    | sed -n '/DATA/p' \
    | awk -v T=$SIZE 'BEGIN{FS="[=:]"}{t+=$7;system("progressbar " sprintf("%d\n", t/T*100))}'

echo

在Ubuntu 14.04上进行测试

$ bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
    • 待办事项**

目录支援
屏幕大小改变时进度条大小改变

7jmck4yq

7jmck4yq4#

我可以给予你一个建议:

ADB_TRACE=adb adb push <source> <destination>

返回任何命令的日志,例如copy命令,如下所示:

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

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

相关问题