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 的使用还将以人类可读的方式转义输出中的隐藏字符,使您在以后出现异常行为时更容易看到发生了什么。