adb获取手机文件

参考视频:https://www.bilibili.com/video/BV1V8411C71r

adb的SDK 平台工具下载:https://developer.android.com/tools/releases/platform-tools?hl=zh-cn

下载下来文件名为:platform-tools.zip

这个简单的命令只使用了三个文件:

adb.exe
AdbWinApi.dll
AdbWinUsbApi.dll

过程在chatgpt有

直接使用adb命令不知道为什么找不到路径,所以先进入adb shell,下面命令找不到路径

adb shell "find /sdcard/ -type f \( -name '*.jpg' -o -name '*.png' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.raw' \)" > /sdcard/files.txt

操作步骤:

adb devices


打开adb shell:
adb shell


用来查找对应后缀文件并生成目录文件的shell命令:
find /sdcard/ -type f \( -name '*.jpg' -o -name '*.png' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.mp4' -o -name '*.raw' \) > /sdcard/files.txt


退出adb shell:
exit


将目录文件传到电脑
adb pull /sdcard/files.txt .


最简单的:(但有问题,不推荐使用)
for /f "delims=" %i in (files.txt) do adb pull "%i" "C:\pic"

注意:files.txt文件转码成ASCII格式

完整的命令,重复名字的文件加时间戳:

test06.bat

::使用时间戳,避免了重复命名的冲突
@echo off
setlocal enabledelayedexpansion

set SOURCE_FILE=files.txt
set TARGET_DIR=C:\testpic
set ERROR_LOG=error_log.txt

if not exist "%TARGET_DIR%" mkdir "%TARGET_DIR%"
if not exist "%ERROR_LOG%" type nul > "%ERROR_LOG%"

for /f "delims=" %%i in (%SOURCE_FILE%) do (
    set FILE_NAME=%%~ni
    set EXTENSION=%%~xi
	set TARGET_PATH="%TARGET_DIR%\!FILE_NAME!!EXTENSION!"

    rem Check if the file already exists in the target directory
    if exist !TARGET_PATH! (
        ::不足两位的补足
		set TIMESTAMP=!TIME: =0!
		::去掉时间戳里的.和:
        set TIMESTAMP=!TIMESTAMP:.=!
        set TIMESTAMP=!TIMESTAMP::=!
        set TARGET_PATH="%TARGET_DIR%\!FILE_NAME!_!TIMESTAMP!!EXTENSION!"
    )

    rem Execute adb pull command
    adb pull "%%i" !TARGET_PATH!
    
    rem Check the adb pull result
    if errorlevel 1 (
        rem If adb pull fails, log the command and error to the error log
        echo adb pull "%%i" >> "%ERROR_LOG%"
        echo ADB Error: failed to pull "%%i". >> "%ERROR_LOG%"
    )
)

endlocal

没成功复制的命令在error_log.txt文件

后缀大小写:

在默认情况下,Android的文件系统是基于Linux的,对于文件名和文件后缀来说,它们是大小写敏感的。

find命令中,-iname选项用于不区分文件名大小写进行匹配,但它不会影响文件后缀的大小写敏感性。也就是说,-iname只影响文件名的匹配,不影响文件后缀的匹配。

所以,如果您使用-iname来查找文件,文件名将不区分大小写,但文件后缀仍然是区分大小写的。如果需要不区分大小写的文件后缀匹配,您可能需要在匹配时考虑多个可能的大小写组合。

需要单独再写个各种大小写组合的后缀名,然后帮忙改成都小写的,再和之前的合并在一起

不过这些貌似不用手动操作,让程序操作就行,

具体步骤:

找到adb.exe目录启动cmd

连接手机,手机启用调试

adb devices

打开adb shell

adb shell

生成文件files.txt

图片视频获取***

find /sdcard/ -type f \( -name '*.jpg' -o -name '*.png' -o -name '*.jpeg' -o -name '*.gif' -o -name '*.raw' \) > /sdcard/files.txt

补充与修正:添加了更多的图片后缀,并且使用iname替代name,使得对后缀大小写不敏感

find /sdcard/ -type f \( -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' -o -iname '*.gif' -o -iname '*.bmp' -o -iname '*.tiff' -o -iname '*.webp' -o -iname '*.apng' -o -iname '*.png8' -o -iname '*.svg' -o -iname '*.raw' \) > /sdcard/files.txt

将在手机上生成的files.txt文件复制到电脑上,在cmd下

adb pull /sdcard/files.txt ./pic_files.txt

视频获取***

find /sdcard/ -type f \( -name '*.avi' -o -name '*.mp4' -o -name '*.mkv' -o -name '*.mov' -o -name '*.wmv' \) > /sdcard/files.txt

补充与修正:添加了更多的视频后缀,并且使用iname替代name,使得对后缀大小写不敏感

find /sdcard/ -type f \( -iname '*.avi' -o -iname '*.mp4' -o -iname '*.mkv' -o -iname '*.mov' -o -iname '*.wmv' -o -iname '*.flv' -o -iname '*.webm' -o -iname '*.ts' -o -iname '*.m4v' -o -iname '*.3gp' -o -iname '*.3g2' \) > /sdcard/files.txt

将在手机上生成的files.txt文件复制到电脑上,在cmd下

adb pull /sdcard/files.txt ./vid_files.txt

文档获取***

find /sdcard/ -type f \( -name '*.pdf' -o -name '*.txt' -o -name '*.md' -o -name '*.doc' -o -name '*.docx' -o -name '*.xls' -o -name '*.xlsx' -o -name '*.ppt' -o -name '*.pptx' -o -name '*.epub' -o -name '*.mobi' \) > /sdcard/files.txt

补充与修正:使用iname替代name,使得对后缀大小写不敏感

find /sdcard/ -type f \( -iname '*.pdf' -o -iname '*.txt' -o -iname '*.md' -o -iname '*.doc' -o -iname '*.docx' -o -iname '*.xls' -o -iname '*.xlsx' -o -iname '*.ppt' -o -iname '*.pptx' -o -iname '*.epub' -o -iname '*.mobi' \) > /sdcard/files.txt

将在手机上生成的files.txt文件复制到电脑上,在cmd下

adb pull /sdcard/files.txt ./doc_files.txt

音频获取

find /sdcard/ -type f \( -name '*.mp3' -o -name '*.m4a' -o -name '*.wav' -o -name '*.wma' \) > /sdcard/files.txt

手机录音是.m4a

补充与修正:使用iname替代name,使得对后缀大小写不敏感

find /sdcard/ -type f \( -iname '*.mp3' -o -iname '*.m4a' -o -iname '*.wav' -o -iname '*.wma' \) > /sdcard/files.txt

将在手机上生成的files.txt文件复制到电脑上,在cmd下

adb pull /sdcard/files.txt ./aud_files.txt

退出adb shell

exit

移动files.txt到电脑

adb pull /sdcard/files.txt .

删除手机上的files.txt

adb shell
rm /sdcard/files.txt
exit

files.txt转码成ASCII(有问题,会乱码)

最终方案为使用notepad++手动点击编码转换

新建文件 转为ANSI编码.bat ,编码为ANSI,不然会乱码
转为ANSI编码.bat

@echo off  
setlocal enabledelayedexpansion  
  
:: 检查是否通过拖放传递了文件  
if "%~1"=="" (  
    echo 请将txt文件拖放到此批处理文件上。  
    pause  
    goto :eof  
)  
  
:: 检查是否为txt文件  
if not "%~x1"==".txt" (  
    echo 仅支持txt文件。  
    pause  
    goto :eof  
)  
  
:: 设置源文件和目标文件路径  
set "sourceFile=%~1"  
:: 输出增加后缀_ansi的文件
:: set "targetFile=%~dpn1_ansi%~x1"  
:: 输出同名文件覆盖原文件
set "targetFile=%~dpn1%~x1"  
  
:: 调用PowerShell脚本来转换编码  
powershell -Command "$sourceFile='%sourceFile%'; $targetFile='%targetFile%'; $content = Get-Content -Path $sourceFile -Encoding UTF8; [System.IO.File]::WriteAllLines($targetFile, $content, [System.Text.Encoding]::Default)"  
  
echo 编码转换完成。转换后的文件已保存为:%targetFile%  
pause

使用
将文件直接拖拽到此bat上
双击此bat打开,拖拽文件到打开的cmd窗口

作用
将UTF-8编码的txt转换为ANSI编码

原理
使用powershell

开始转移

::使用时间戳,避免了重复命名的冲突
@echo off
setlocal enabledelayedexpansion

set SOURCE_FILE=files.txt
set TARGET_DIR=C:\testpic
set ERROR_LOG=error_log.txt

if not exist "%TARGET_DIR%" mkdir "%TARGET_DIR%"
if not exist "%ERROR_LOG%" type nul > "%ERROR_LOG%"

for /f "delims=" %%i in (%SOURCE_FILE%) do (
    set FILE_NAME=%%~ni
    set EXTENSION=%%~xi
	set TARGET_PATH="%TARGET_DIR%\!FILE_NAME!!EXTENSION!"

    rem Check if the file already exists in the target directory
    if exist !TARGET_PATH! (
        ::不足两位的补足
		set TIMESTAMP=!TIME: =0!
		::去掉时间戳里的.和:
        set TIMESTAMP=!TIMESTAMP:.=!
        set TIMESTAMP=!TIMESTAMP::=!
        set TARGET_PATH="%TARGET_DIR%\!FILE_NAME!_!TIMESTAMP!!EXTENSION!"
    )

    rem Execute adb pull command
    adb pull "%%i" !TARGET_PATH!
    
    rem Check the adb pull result
    if errorlevel 1 (
        rem If adb pull fails, log the command and error to the error log
        echo adb pull "%%i" >> "%ERROR_LOG%"
        echo ADB Error: failed to pull "%%i". >> "%ERROR_LOG%"
    )
)

endlocal

删除

现将文件转化成utf-8格式

files.txt上传到手机/sdcard/目录下

adb push doc_files.txt /sdcard/files.txt

执行shell命令

adb shell
while read file; do rm "$file"; done < /sdcard/files.txt
exit

在cmd中显示的是执行错误的,没错误就不显示

删除进度

现在删除了vid_files.txt路径下所有,doc_files.txt【小说】部分