adbは複数のファイルをプルします


87

を使用して複数のファイルをプルするための最良の方法は何ですか

adb pull

私は自分で持っている/sdcard/次の名前を持つ25個のファイル:

gps1.trace
gps2.trace
...
gps25.trace

ワイルドカードが機能しない:

adb pull /sdcard/gps*.trace .

4
私は使用しませんadbが、ドキュメントからpullディレクトリ全体をプルするために使用できますか?それはケースだと、これらは、独自のアプリケーションによって生成されたファイルであれば、なぜなどのサブディレクトリにそれらを記述しないで/sdcard/mygpsfiles、次に使いますadb pull /sdcard/mygpsfiles。それはうまくいくでしょうか?
スクォンク2012年

2
または、DDMS日食の観点からファイルエクスプローラーを試したところ、SDカードからファイルを複数選択して実行することができpullました。Eclipseを使用しない場合、DDMSは別のSDKツールとして利用できます。
スクォンク2012年

monitorコマンドはうまく機能し<sdkdir>/toolsます。
Santosh Kumar 2013

回答:


141

ワイルドカードを受け入れるコマンドxargsの結果を使用できますadb shell ls。これにより、複数のファイルをコピーできます。迷惑なことに、adb shell lsコマンドの出力には、を使用して削除できる改行制御文字が含まれていますtr -d '\r'

例:

adb shell 'ls sdcard/gps*.trace' | tr -d '\r' | xargs -n1 adb pull
adb shell 'ls /sdcard/*.txt' | tr -d '\r' | sed -e 's/^\///' | xargs -n1 adb pull

実際には、これらはフィルタリングする必要のあるキャリッジリターンですが、あいまいな問題に関する正しい考え
Chris Stratton 2012年

4
ファイル名のスペースを処理できるわずかに改善されたバージョンは次のとおり
sschuberth

参考:WindowsとDOSは、キャリッジリターン/ラインフィードのペアに「\ r \ n」を使用します(つまり、「\ n \ r」ではありません)。
BrainSlugs83 2014年

3
私の場合、Androidのルートディレクトリから(正しく取得された)ファイル名を取得しようとして失敗しました。これを解決するために、次を使用しました。 adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps

4
trが内部コマンドまたは外部コマンドとして認識されない
Suncatcher

101

adb pull ファイルではなくディレクトリ名を受け取ることができ、すべてのファイルを含むディレクトリをプルします。

/ sdcard / gpsTracesにあるすべてのgpsトレースをプルします

adb pull /sdcard/gpsTraces/ . 

adb pulladb push再帰的なディレクトリの:

C:\Test>adb pull /data/misc/test/ .
pull: building file list...
pull: /data/misc/test/test1/test2/test.3 -> ./test1/test2/test.3
pull: /data/misc/test/test1/test2/test.2 -> ./test1/test2/test.2
pull: /data/misc/test/test1/test2/test.1 -> ./test1/test2/test.1
pull: /data/misc/test/test1/test.3 -> ./test1/test.3
pull: /data/misc/test/test1/test.2 -> ./test1/test.2
pull: /data/misc/test/test1/test.1 -> ./test1/test.1
pull: /data/misc/test/test.3 -> ./test.3
pull: /data/misc/test/test.2 -> ./test.2
pull: /data/misc/test/test.1 -> ./test.1
9 files pulled. 0 files skipped.
0 KB/s (45 bytes in 0.093s)

C:\Test>adb push . /data/misc/test/
push: ./test1/test2/test.3 -> /data/misc/test/test1/test2/test.3
push: ./test1/test2/test.2 -> /data/misc/test/test1/test2/test.2
push: ./test1/test2/test.1 -> /data/misc/test/test1/test2/test.1
push: ./test1/test.3 -> /data/misc/test/test1/test.3
push: ./test1/test.2 -> /data/misc/test/test1/test.2
push: ./test1/test.1 -> /data/misc/test/test1/test.1
push: ./test.3 -> /data/misc/test/test.3
push: ./test.2 -> /data/misc/test/test.2
push: ./test.1 -> /data/misc/test/test.1
9 files pushed. 0 files skipped.
0 KB/s (45 bytes in 0.062s)

3
@kakyoそれは私にとってサブフォルダーのために働きます。あなたがグーグルから最新のADBを持っていることを確認してください。(私は1.0.29を使用しています)
オフィールルソン

はい、最終的には空でないフォルダでも機能することがわかりました。プルされなかった空のフォルダがいくつかありました。また、「プッシュ」は非再帰的であるように思われますか?
kakyo 2012年

@kakyo再帰的なプルとプッシュの出力を答えに追加しました。あなたは空のフォルダについて正しいです、それらは引っ張られたり押されたりしません。
Ofir Luzon 2012

1
注意:ADBプルを使用すると、ファイルは元の変更日を失います。
スタン

3
@Stan:「adbpull [-a] <remote> ... <local>」のように「-a」オプションを使用しない限り、ヘルプによると、ファイルのタイムスタンプとモードが保持されます。
ラスティギア

27

./adb pull /sdcard <-失敗

./adb pull /sdcard/ <-再帰的に機能します-末尾のスラッシュに注意してください

2014年3月にダウンロードしたNexus5とadbでテスト済み。


1
私にとっては、最後のスラッシュなしで再帰的に機能しました。adbバージョン1.0.32
Antonio

@Antonioが正しいので、賛成票を取り戻す必要があります。
Shayan

8

'ls'からの出力を解析することは一般的に悪い考えです。代わりに、「find」を使用してください。

adb shell 'find /sdcard/ -name "gps*.trace" -print0' | xargs -0 -n 1 adb pull

lsの出力を解析すべきではない理由


私のマシンでは、adbへのフルパスを使用する必要がありましたが、それ以外の場合はうまくいきました。
ダン

この答えは実際にはかなり賢いです。よくやった!
ダースエグレジャス

6

にもかかわらずadb pullコマンドは、リモート・パラメータのフォルダ名を受け入れ始め、私はまだ使用することを好むtarのコマンドを。(両方のファイル名パターンが可能になります-それはより多くの柔軟性を提供含める除外、)シンボリックリンク制御、ファイルのアクセス権を保持します。Android 6.0以降、組み込みを使用できます。その前は、次のようなサードパーティのツールを使用する必要がありましたbusybox

adb exec-out tar c sdcard/amazonmp3 > amazon.tar

/パスの先頭は必ず省略してください。


ああ、うまくいきませんでした。tar -tvfは、結果がtarアーカイブのように見えないことを示しています。しかたがない。
themuddler 2013

非常に強力な方法です!しかし、問題は、出力ファイルに追加された「tar:メンバー名から先頭の「/」を削除する」などのエラー/警告です。これを排除する方法がわからない。
x'ES 2017年

出力に1.5KBのファイルがあります。
Shayan

5

これはWindowsボックス用に作成しました。ファイルシステムをマウントせずにワイルドカードを使用してファイルを転送すると非常に便利です。このスクリプトは、パス環境のどこかに含めることができます。

adbpull.bat

@echo off
setlocal enabledelayedexpansion
if %1.==. (
    echo Wilcard parameter is required.
    goto end
)
for /F "tokens=* USEBACKQ" %%F in (`adb shell ls %1`) do (
    set text=%%F
    set mfile=!text:~0,-1!
    adb pull "!mfile!"
)
:end
endlocal

例: adbpull /sdcard/DCIM/Camera/IMG_2016*



3

ディレクトリプルは、新しいAndroidツールで利用できます。(どのバージョンから追加されたかはわかりませんが、最新のADT 21.1で動作します)

adb pull /sdcard/Robotium-Screenshots
pull: building file list...
pull: /sdcard/Robotium-Screenshots/090313-110415.jpg -> ./090313-110415.jpg
pull: /sdcard/Robotium-Screenshots/090313-110412.jpg -> ./090313-110412.jpg
pull: /sdcard/Robotium-Screenshots/090313-110408.jpg -> ./090313-110408.jpg
pull: /sdcard/Robotium-Screenshots/090313-110406.jpg -> ./090313-110406.jpg
pull: /sdcard/Robotium-Screenshots/090313-110404.jpg -> ./090313-110404.jpg
5 files pulled. 0 files skipped.
61 KB/s (338736 bytes in 5.409s)

2

デビッドの答えに基づいて、私はこれが少し良いと思います:

adb shell ls /foo | tr -d '\r' | xargs -n1 adb pull

入力する文字が1文字少ない(大したこと)ことに加えて、-rをスペースに変換しません。これは、あなたがやろうとしているように、大きな違いです

adb shell ls /foo/myFile* | tr '\r' ' ' | xargs -i -n1 adb pull {} someDir

エラーが発生します

remote object '/foo/myFile1 ' does not exist

代わりに、これを行うことができます。これは機能します。

adb shell ls /foo/myFile* | tr -d '\r' | xargs -i -n1 adb pull {} someDir 

0

私の場合、ワイルドカードが機能します。次の簡単なスクリプトを使用して、仮想デバイスのWhatsappイメージをデスクトップにインポートしています。

#! /bin/bash
mkdir -p ~/Pictures/Pictures_adb
rm -f ~/Pictures/Pictures_adb/*
cd ~/Pictures/Pictures_adb
adb root
adb shell 'cp /data/media/0/WhatsApp/Media/WhatsApp\ Profile\ Photos/* /sdcard/Pictures/;exit'
adb pull /sdcard/Pictures
mv ~/Pictures/Pictures_adb/Pictures/* ~/Pictures/Pictures_adb/
rmdir ~/Pictures/Pictures_adb/Pictures
cd

Androidのcpにはワイルドカードを使用し、ホストのプルにはワイルドカードを使用しないため、機能します。/ sdcard /にコピーすると余分なメモリが必要になり、プライベートファイルがsdcardにリークしますが、良い代替手段です。
user905686 2018年

0

パワーシェル:

adb shell ls /sdcard/gps*.trace | foreach {adb pull $_}


-3

Androidには、権限が関連付けられたフォルダーがいくつかあります。一部のフォルダは、rootユーザーまたはシステムユーザーに属しています。

「adbpull」を実行する前に、これらのファイル、フォルダーのアクセス許可を変更する必要があります。

次のコマンドが役立ちます。

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.