[開発者向け] Androidからadbで大量ファイルをPCにコピーする
概要
Android端末からPCへのファイル転送にはUSBファイル転送機能が利用可能です。しかし、ファイルの大量コピーを実施する際にエラーが出ることがあります。(例:セマフォがタイムアウトしました)
そこで別の手段として、開発者向けのツールであるADB(Android Debug Bridge)を使えば端末からファイルを取得できますが、取得するファイルの指定にワイルドカードが使えないため1ファイルずつ指定して取得する必要があります。
そんなとき、Windowsの場合はPowerShellと組み合わせてADBを実行することで特定ディレクトリ配下のファイルをPCにすべて転送することが可能です。(事前にADBが利用できるようになっている必要がありますので開発者向け手段です)
adb shell ls /sdcard/DCIM/Camera | % { adb pull "/sdcard/DCIM/Camera/$_" E:\backup\DCIM\Camera }
解説
ADBでファイルを取得するにはadbのpullサブコマンドを利用します。指定方法は以下の通りです。
adb pull 端末上のパス PC上のパス
この「端末上のパス」にはワイルドカード(アスタリスク)が指定できません。そこで、adbのshellサブコマンドを使ってls(ファイルリストコマンド)を実行し、ファイルの一覧を取得します。
PowerShellにて出力結果を配列としてパイプに渡し、ForEach-Objectで1つずつ処理します。
adb shell ls /sdcard/DCIM/Camera | ForEach-Object { adb pull "/sdcard/DCIM/Camera/$_" E:\backup\DCIM\Camera }
ForEach-Objectにはエイリアスとして%(パーセント)が存在するため、コマンドラインとして入力するときは、簡便化のためにエイリアスを使ってもいいと思います。
最終形として、概要で示した以下の形になります。
adb shell ls /sdcard/DCIM/Camera | % { adb pull "/sdcard/DCIM/Camera/$_" E:\backup\DCIM\Camera }
(2024/08/19追記) 差分転送したい場合
2回目以降の転送など、すでに存在するファイルをスキップしたい場合はWhere-Object(のエイリアスの?)を使って以下のように書けます。
adb shell ls /sdcard/DCIM/Camera | ? { (Test-Path "E:\backup\DCIM\Camera\$_") -ne $True } | % { adb pull "/sdcard/DCIM/Camera/$_" E:\backup\DCIM\Camera }
補足
Android Studioはインストールしているけれどadbがどこに行ったかわからなくなったときのためにパスをメモします。バージョンによって異なるかもしれません。
Android Studio 2023.3.1の場合
$env:USERPROFILE\AppData\Local\Android\Sdk\platform-tools
Discussion