bash:通过 adb shell 检索 Android 个图像文件名
bash: Retrieving Android image filenames over adb shell
这是一个让我发疯的单行:
$ adb shell ls /sdcard/DCIM/Camera | grep IMG_20150630|while read f; do echo "pull /sdcard/DCIM/Camera/$f"; done
pull /sdcard/DCIM/Camera/IMG_20150630_091806.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_091817.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_091819.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_091822.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_091842.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_175231:nopm:.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_175340:nopm:.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_222520.jpg
很好。现在我想在 $f
:
之后添加一些东西
$ adb shell ls /sdcard/DCIM/Camera | grep IMG_20150630|while read f; do echo "pull /sdcard/DCIM/Camera/$f ./"; done
./l /sdcard/DCIM/Camera/IMG_20150630_091806.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_091817.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_091819.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_091822.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_091842.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_175231:nopm:.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_175340:nopm:.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_222520.jpg
卧槽?!在 $f
之后添加的字符实际上添加到每一行的开头。
Mac OS X 10.10.4,使用 GNU bash,版本 4.3.30(1)-release (x86_64-apple-darwin14.0.0)
有一个 CR。我想 adb
returns 每行都有一个 CRLF?奇怪,这里没有Windows。
$ adb shell ls /sdcard/DCIM/Camera | grep IMG_20150630|head -n 1 |xxd
0000000: 494d 475f 3230 3135 3036 3330 5f30 3931 IMG_20150630_091
0000010: 3830 362e 6a70 670d 0a 806.jpg..
使用 NUL 分隔的流是通过网络传输任意文件名的更好方法。 (现在,如果您将 CR
转换为堆栈中某处的 CRLF
,这是一个单独的问题——但这也将避免它,除非您的文件名包含文字 CR。
#!/bin/bash
while IFS= read -r -d ''; do
printf 'pull %q\n' "$REPLY"
done < <(adb shell printf '%s[=10=]' /sdcard/DCIM/Camera/*IMG_20150630*)
%q
的使用还将以人类可读的方式转义输出中的隐藏字符,使您在以后出现异常行为时更容易看到发生了什么。
这是一个让我发疯的单行:
$ adb shell ls /sdcard/DCIM/Camera | grep IMG_20150630|while read f; do echo "pull /sdcard/DCIM/Camera/$f"; done
pull /sdcard/DCIM/Camera/IMG_20150630_091806.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_091817.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_091819.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_091822.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_091842.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_175231:nopm:.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_175340:nopm:.jpg
pull /sdcard/DCIM/Camera/IMG_20150630_222520.jpg
很好。现在我想在 $f
:
$ adb shell ls /sdcard/DCIM/Camera | grep IMG_20150630|while read f; do echo "pull /sdcard/DCIM/Camera/$f ./"; done
./l /sdcard/DCIM/Camera/IMG_20150630_091806.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_091817.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_091819.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_091822.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_091842.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_175231:nopm:.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_175340:nopm:.jpg
./l /sdcard/DCIM/Camera/IMG_20150630_222520.jpg
卧槽?!在 $f
之后添加的字符实际上添加到每一行的开头。
Mac OS X 10.10.4,使用 GNU bash,版本 4.3.30(1)-release (x86_64-apple-darwin14.0.0)
有一个 CR。我想 adb
returns 每行都有一个 CRLF?奇怪,这里没有Windows。
$ adb shell ls /sdcard/DCIM/Camera | grep IMG_20150630|head -n 1 |xxd
0000000: 494d 475f 3230 3135 3036 3330 5f30 3931 IMG_20150630_091
0000010: 3830 362e 6a70 670d 0a 806.jpg..
使用 NUL 分隔的流是通过网络传输任意文件名的更好方法。 (现在,如果您将 CR
转换为堆栈中某处的 CRLF
,这是一个单独的问题——但这也将避免它,除非您的文件名包含文字 CR。
#!/bin/bash
while IFS= read -r -d ''; do
printf 'pull %q\n' "$REPLY"
done < <(adb shell printf '%s[=10=]' /sdcard/DCIM/Camera/*IMG_20150630*)
%q
的使用还将以人类可读的方式转义输出中的隐藏字符,使您在以后出现异常行为时更容易看到发生了什么。