如果您将大文件推送/拉到设备,那么现在无处可去,这真的很烦人。是否可以使用“bar”实用程序运行adb push或adb pull并获取进度条?
这里的主要问题是我认为adb需要两个文件名,如果输入文件可以被stdin替换,你可以通过'bar'实用程序并获得进度条。到目前为止,我还没有成功,但我不是一个真正的shell大师,这就是为什么我在这里问:)
请注意,我在Linux上使用bash。
答案 0 :(得分:27)
看起来最新的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&#39;没有进度选项。我修改了第一个答案的脚本以这种方式工作:
创建&#34; adb-install.sh&#34;在PATH的某个地方运行&#34; adb-install.sh&#34;而不是&#34; adb install -f&#34;
#!/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
答案 1 :(得分:13)
目前我有一小部分bash:
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'显示的字节/秒和总字节数不正确。
我挑战你改进我的剧本;这应该不难! ;)
答案 2 :(得分:8)
我为adb做了一个补丁来解决这个问题。
答案 3 :(得分:7)
这是我的解决方案,它将显示一个简单的进度条和当前的数字进度
[==================================================] 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)
<强> TODO 强>
目录支持
屏幕尺寸更改时进度条尺寸更改
答案 4 :(得分:4)
QtADB同时拥有每个文件和总进度条。 http://qtadb.wordpress.com/
答案 5 :(得分:3)
我可以给你一个想法:
ADB_TRACE=adb adb push <source> <destination>
返回任何命令的日志,例如复制命令,如下所示:
writex: fd=3 len=65544: 4441544100000100000000021efd DATA....#....b..
这里你可以使用ls -a获得之前的总字节长度,然后用grep或awk解析adb的输出,递增一个内部计数器并将当前进度发送到bar实用程序。
成功后,请在此处发布脚本。
答案 6 :(得分:1)
我发现Python pastebin不完整但很接近:它需要\r
和参数支持。