android - 将使用 adb 从手机相机传输照片的脚本

标签 android bash sh adb

故事

我用手机摄像头拍照和录制视频,并将它们全部保存在我的内部存储器/SD 卡上。我定期在我的电脑上备份它们,所以我将这些相机照片保存在电脑存储上与手机存储同步。

多年来,我一直通过以下方式将我的手机相机照片备份到我的电脑:

  1. 将手机插入电脑并允许访问手机数据
  2. 浏览手机存储 → DCIM → 相机
  3. 等待几分钟让系统加载所有照片的列表
  4. 只复制几张尚未备份的最新照片

我认为等待几分钟加载所有照片是不必要的拖累所以我下载了adb platform tools .我已将文件夹 bin 添加到我的 Path 环境变量(即 %USERPROFILE%\Tools\adb-platform-tools_r28.0.3),以便我可以无缝地使用 adb 而不是每次都写完整路径。

脚本

我为 Git Bash 编写了以下脚本适用于 Windows。如果您更改 $userprofile 变量,它也与 Unix 兼容。本质上,该脚本将两个日期之间的相机照片从手机存储中提取到 PC

# Attach device and start deamon process
adb devices

# Initialize needed variables
userprofile=$(echo "$USERPROFILE" | tr "\\" "/") # Windows adjustments

srcFolder="//storage/06CB-C9CE/DCIM/Camera"    # Remote folder
dstFolder="$userprofile/Desktop/CameraPhotos"  # Local folder
lsFile="$dstFolder/camera-ls.txt"
filenameRegex="2019061[5-9]_.*"  # Date from 20190615 to 20190619

# Create dst folder if it doesn't exist
mkdir -p "$dstFolder"

# 1. List contents from src folder
# 2. Filter out file names matching regex
# 3. Write these file names line by line into a ls file
adb shell ls "$srcFolder" | grep -E "$filenameRegex" > "$lsFile"

# Pull files listed in ls file from src to dst folder
while read filename; do
  if [ -z "$filename" ]; then continue; fi
  adb pull "$srcFolder/$filename" "$dstFolder" # adb: error: ...
done < "$lsFile"

# Clean up
rm "$lsFile"

# Inform the user
echo "Done pulling files to $dstFolder"

问题

当我运行脚本 (bash adb-pull-camera-photos.sh) 时,除了 while 中的 adb pull 命令外,一切都运行顺利-循环。 它给出了以下错误:

': No such file or directoryemote object '//storage/06CB-C9CE/DCIM/Camera/20190618_124656.jpg
': No such file or directoryemote object '//storage/06CB-C9CE/DCIM/Camera/20190618_204522.jpg
': No such file or directoryemote object '//storage/06CB-C9CE/DCIM/Camera/20190619_225739.jpg

我不确定为什么输出被破坏了。有时,当我调整 Git Bash 窗口的大小时,一些文本会乱七八糟。这是实际的错误文本:

adb: error: failed to stat remote object '//storage/06CB-C9CE/DCIM/Camera/20190618_124656.jpg': No such file or directory
adb: error: failed to stat remote object '//storage/06CB-C9CE/DCIM/Camera/20190618_204522.jpg': No such file or directory
adb: error: failed to stat remote object '//storage/06CB-C9CE/DCIM/Camera/20190619_225739.jpg': No such file or directory

我确定这些文件存在于手机的指定目录中。 当我在 bash 中手动执行失败的命令时,成功并输出以下内容:

$ adb pull "//storage/06CB-C9CE/DCIM/Camera/20190618_124656.jpg" "C:/Users/User/Desktop/CameraPhotos/"
//storage/06CB-C9CE/DCIM/Camera/20190618_124656.jpg: 1 file pulled. 15.4 MB/s (1854453 bytes in 0.115s)

问题

我不知道脚本有什么问题。我认为Windows系统可能会引起骚动,因为我看不出为什么同样的代码在手动输入时有效,但在脚本中运行时却不起作用。如何修复此错误?

附加信息

  • 请注意,在 Windows 上,我必须在绝对路径的开头使用 //,因为 Git Bash 会将 / 解释为它自己的根目录 (C :\Program Files\Git).
  • 我已经回显脚本中的所有变量,并获得了所有正确的路径,否则可以通过手动方法工作。

camera-ls.txt 文件内容

20190618_124656.jpg
20190618_204522.jpg
20190619_225739.jpg

其他问题

  1. 是否可以在不使用名称的情况下导航到外部 SD 卡?我必须使用 /storage/06CB-C9CE/ 因为 /sdcard/ 导航到内部存储。
  2. 为什么 tr "\\""/" 给我这个错误:tr: warning: an unescaped backslash at end of string is not portable?

最佳答案

Windows 批处理脚本

这是一个 .bat 脚本,可以通过 Windows 命令提示符Windows PowerShell 运行。不需要 Git Bash。

:: Start deamon of the device attached
adb devices

:: Pull camera files starting from date
set srcFolder=/storage/06CB-C9CE/DCIM/Camera
set dstFolder=%USERPROFILE%\Desktop\CameraPhotos
set lsFile=%USERPROFILE%\Desktop\CameraPhotos\camera-ls.txt
set dateRegex=2019061[5-9]_.*

mkdir %dstFolder%
adb shell ls %srcFolder% | adb shell grep %dateRegex% > %lsFile%
for /F "tokens=*" %%A in (%lsFile%) do adb pull %srcFolder%/%%A %dstFolder%
del %lsFile%
echo Done pulling files to %dstFolder%
  • 只需编辑 srcFolder 以指向您的手机相机文件夹,
  • 将模式插入 dateRegex 以匹配日期间隔和
  • 将其保存为扩展名为 .bat 的文件,即:adb-pull-camera-photos.bat
  • 双击该文件,它会将过滤后的照片拉入桌面上的 CameraPhotos 文件夹。

请记住,您仍然需要 adb适用于您 PC 上的 Windows。

关于android - 将使用 adb 从手机相机传输照片的脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56691427/

相关文章:

linux sed 仅在编辑第一行时读取整个文件

android - 如何在 Android 中保存相机拍摄的图片(应用 glsl 效果)?

android - 使用 BottomAppBar 或 BottomNavigationView 创建自定义底部 View

bash - 蒙戈 : drop collection using the terminal

c - 如何在 system() 中执行多个命令,也使用变量

bash - 打印两个给定数字之间的所有数字

bash - 是否可以使用 "set -e"但允许某些命令失败?

linux - 仅特定用户 Shell 脚本的 USERID、PID、TIME 和 COMMAND

android - 一些有助于发现内存泄漏

android - 上一个完成后如何使用一个rxjava observable?