adb menarik banyak file

87

Apa cara terbaik untuk menarik banyak file menggunakan

adb pull

Saya memiliki /sdcard/25 file saya dengan nama berikut:

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

Karakter pengganti tidak berfungsi:

adb pull /sdcard/gps*.trace .
hsz
sumber
4
Saya tidak menggunakan adbtetapi dari dokumen pulldapat digunakan untuk menarik seluruh direktori ??? Jika demikian dan ini adalah file yang dihasilkan oleh aplikasi Anda sendiri, mengapa tidak menuliskannya ke sub-direktori seperti /sdcard/mygpsfilesdan kemudian menggunakan adb pull /sdcard/mygpsfiles. Apakah itu akan berhasil?
Squonk
2
Sebagai alternatif, saya baru saja mencoba File Explorer dalam DDMSperspektif gerhana dan dapat memilih banyak file dari sdcard saya dan melakukan pullpada mereka. Jika Anda tidak menggunakan eclipse, DDMS tersedia sebagai alat SDK terpisah.
Squonk
monitorperintah berfungsi dengan baik, harus masuk <sdkdir>/tools!
Santosh Kumar

Jawaban:

142

Anda dapat menggunakan xargsdan hasil dari adb shell lsperintah yang menerima wildcard. Ini memungkinkan Anda untuk menyalin banyak file. Secara menjengkelkan, output dari adb shell lsperintah tersebut menyertakan karakter kontrol baris-feed yang dapat Anda hapus menggunakan tr -d '\r'.

Contoh:

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
David Momenso
sumber
sebenarnya itu adalah pengembalian kereta yang harus disaring, tetapi ide yang tepat pada masalah yang tidak jelas
Chris Stratton
4
Berikut adalah versi yang sedikit lebih baik yang dapat menangani spasi dalam nama file: github.com/sschuberth/dev-scripts/blob/master/android/…
sschuberth
FYI: Windows dan DOS menggunakan "\ r \ n" untuk pasangan carriage-return / line-feed (yaitu, bukan "\ n \ r").
BrainSlugs83
3
dalam kasus saya itu gagal mencoba menarik nama file (diperoleh dengan benar) dari direktori root android, untuk mengatasinya, saya menggunakan:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps
4
Tidak berhasil mengatakan tr tidak dikenali sebagai perintah internal atau eksternal
Suncatcher
101

adb pull dapat menerima nama direktori alih-alih pada file dan itu akan menarik direktori dengan semua file di dalamnya.

Tarik semua jejak gps Anda di / sdcard / gpsTraces

adb pull /sdcard/gpsTraces/ . 

Contoh dari adb pulldan adb pushdirektori rekursif:

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)
Ofir Luzon
sumber
3
@kakyo Ini berfungsi untuk subfolder untuk saya. periksa apakah Anda memiliki ADB terbaru dari google. (Saya menggunakan 1.0.29)
Ofir Luzon
Ya, saya menemukan bahwa itu berfungsi untuk folder yang tidak kosong pada akhirnya. Saya memiliki beberapa folder kosong yang tidak ditarik. Juga, tampaknya "push" itu non-rekursif?
kakyo
@kakyo Saya telah menambahkan output dari tarikan dan dorong rekursif ke jawaban saya. Anda benar tentang folder kosong, folder tersebut tidak ditarik atau didorong.
Ofir Luzon
1
Hati-hati: dengan ADB tarik file kehilangan tanggal modifikasi aslinya.
Stan
3
@Stan: kecuali Anda menggunakan opsi "-a" seperti dalam "adb pull [-a] <remote> ... <local>", yang menurut bantuan tersebut mempertahankan stempel waktu dan mode file.
Rusty Gear
27

./adb pull /sdcard <- gagal

./adb pull /sdcard/ <- bekerja secara rekursif - perhatikan garis miring di belakangnya

Diuji dengan Nexus 5 dan adb yang diunduh Maret 2014.

Memposting sebagai tamu tamu
sumber
1
Bagi saya ini bekerja secara rekursif tanpa garis miring terakhir, adb versi 1.0.32
Antonio
Saya perlu menarik kembali suara positif saya karena @Antonio benar.
Shayan
8

Mengurai keluaran dari 'ls' umumnya merupakan ide yang buruk. Sebagai gantinya, gunakan 'temukan'.

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

Mengapa Anda tidak perlu mengurai output ls

Ismail
sumber
Di komputer saya, saya perlu menggunakan jalur lengkap ke adb, tetapi jika tidak, ini berfungsi dengan baik!
Dan J
Jawaban ini sebenarnya cukup cerdas. Kerja bagus!
Darth Egregious
6

Meskipun adb pullperintah mulai menerima nama folder untuk parameter jarak jauh, saya masih lebih suka menggunakan tarperintah. Ini memberikan lebih banyak fleksibilitas - memungkinkan pola nama file ( termasuk dan mengecualikan ), kontrol symlink, mempertahankan izin file. Sejak Android 6.0 Anda dapat menggunakan file bawaan. Sebelumnya Anda harus menggunakan alat pihak ketiga seperti busybox:

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

Pastikan untuk menghilangkan petunjuk /di jalan Anda.

themuddler
sumber
Oh, tidak berhasil. tar -tvf memberi tahu saya bahwa hasilnya tidak terlihat seperti arsip tar. Baiklah.
themuddler
Cara yang sangat kuat! Tetapi masalahnya adalah kesalahan / peringatan seperti "tar: menghapus awalan '/' dari nama anggota" ditambahkan ke file keluaran. Tidak tahu bagaimana menghilangkan ini.
x'ES
Saya mendapatkan file 1.5KB pada output.
Shayan
5

Saya telah membuat ini untuk kotak Windows, Sangat berguna untuk mentransfer file menggunakan wildcard tanpa memasang sistem file. Anda dapat menyertakan skrip ini di suatu tempat di jalur env.

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

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

cardeol
sumber
3

Tarik direktori tersedia di alat android baru. (Saya tidak tahu dari versi mana itu ditambahkan, tetapi berfungsi pada ADT 21.1 terbaru)

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)
Palani
sumber
2

berdasarkan jawaban David, saya merasa ini sedikit lebih baik:

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

Selain itu menjadi satu karakter yang kurang untuk diketik (masalah besar) itu tidak mengubahnya -rmenjadi spasi. Ini adalah perbedaan yang signifikan, seolah-olah Anda mencoba melakukannya

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

Anda akan mendapatkan kesalahan mengatakan

remote object '/foo/myFile1 ' does not exist

Sebagai gantinya Anda dapat melakukan ini, yang akan berhasil:

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

Kartu liar berfungsi dalam kasus saya, saya telah menggunakan skrip sederhana berikut untuk mengimpor Gambar Whatsapp dari perangkat virtual saya ke desktop saya

#! /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
srinivasu u
sumber
Anda menggunakan wildcard untuk cp di Android dan bukan untuk menarik host, itulah mengapa ini berhasil. Alternatif yang bagus, meskipun menyalin ke / sdcard / membutuhkan memori ekstra dan membocorkan file pribadi ke sdcard.
pengguna905686
0

PowerShell:

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

Sam adalah
sumber
-3

Di Android, ada beberapa folder dengan izin terkait! Beberapa folder milik root- atau pengguna sistem.

Kalian harus mengubah hak akses file, folder sebelum melakukan "adb pull".

Perintah berikut dapat membantu:

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
Tim Long
sumber