adb kéo nhiều tệp


87

Cách tốt nhất để kéo nhiều tệp bằng cách sử dụng

adb pull

Tôi có trên /sdcard/25 tệp của mình với tên sau:

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

Ký tự đại diện không hoạt động:

adb pull /sdcard/gps*.trace .

4
Tôi không sử dụng adbnhưng từ tài liệu pullcó thể được sử dụng để kéo toàn bộ thư mục ??? Nếu đúng như vậy và đây là các tệp được tạo bởi ứng dụng của riêng bạn thì tại sao không ghi chúng vào một thư mục con chẳng hạn như /sdcard/mygpsfilessau đó sử dụng adb pull /sdcard/mygpsfiles. Liệu điều đó có hiệu quả?
Squonk

2
Ngoài ra, tôi vừa thử File Explorer dưới DDMSgóc nhìn của nhật thực và có thể chọn nhiều tệp từ sdcard của mình và thực hiện pulltrên chúng. Nếu bạn không sử dụng eclipse, DDMS có sẵn như một công cụ SDK riêng biệt.
Squonk

monitorlệnh hoạt động tuyệt vời, nên được trong <sdkdir>/tools!
Santosh Kumar

Câu trả lời:


141

Bạn có thể sử dụng xargsvà kết quả của adb shell lslệnh chấp nhận các ký tự đại diện. Điều này cho phép bạn sao chép nhiều tệp. Thật khó chịu khi đầu ra của adb shell lslệnh bao gồm các ký tự điều khiển nguồn cấp dữ liệu dòng mà bạn có thể xóa bằng cách sử dụng tr -d '\r'.

Ví dụ:

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

thực sự đó là những kí tự xuống dòng mà phải được lọc, nhưng ý tưởng đúng về một vấn đề tối nghĩa
Chris Stratton

4
Dưới đây là một phiên bản cải tiến nhẹ có thể xử lý khoảng trống trong tên tập tin: github.com/sschuberth/dev-scripts/blob/master/android/...
sschuberth

FYI: Windows và DOS sử dụng "\ r \ n" cho các cặp ký tự xuống dòng / xuống dòng (tức là không phải "\ n \ r").
BrainSlugs83

3
trong trường hợp của tôi nó không cố gắng để kéo tên tập tin (thu được một cách chính xác) từ thư mục gốc của android, để giải quyết nó, tôi đã sử dụng:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps

4
Nó không làm việc nói tr không được công nhận như là một lệnh nội bộ hay bên ngoài
Suncatcher

101

adb pull có thể nhận một tên thư mục thay vì tại tệp và nó sẽ kéo thư mục có tất cả các tệp trong đó.

Kéo tất cả các dấu vết gps của bạn vào / sdcard / gpsTraces

adb pull /sdcard/gpsTraces/ . 

Ví dụ về adb pulladb pushvề thư mục đệ quy:

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 Đối với tôi, nó hoạt động với các thư mục con. kiểm tra xem bạn có ADB mới nhất từ ​​google. (Tôi đang sử dụng 1.0.29)
Ofir Luzon

Có, tôi thấy rằng nó hoạt động cho các thư mục không trống. Tôi có một số thư mục trống không được kéo. Ngoài ra, có vẻ như "push" là không đệ quy?
kakyo 31/10/12

@kakyo Tôi đã thêm đầu ra của một pull và push đệ quy cho câu trả lời của mình. Bạn nói đúng về các thư mục trống, chúng không bị kéo hoặc đẩy.
Ofir Luzon

1
Lưu ý: với việc kéo ADB, các tệp sẽ mất ngày sửa đổi ban đầu.
Stan

3
@Stan: trừ khi bạn sử dụng tùy chọn "-a" như trong "adb pull [-a] <remote> ... <local>", tùy chọn này sẽ giữ nguyên chế độ và dấu thời gian của tệp.
Rusty Gear

27

./adb pull /sdcard <- không thành công

./adb pull /sdcard/ <- hoạt động đệ quy - lưu ý dấu gạch chéo ở cuối

Đã thử nghiệm với Nexus 5 và adb tải xuống tháng 3 năm 2014.


1
Đối với tôi, nó hoạt động đệ quy mà không có dấu gạch chéo cuối cùng, adb phiên bản 1.0.32
Antonio

Tôi cần lấy lại phiếu ủng hộ của mình vì @Antonio là chính xác.
Shayan

8

Phân tích cú pháp đầu ra từ 'ls' nói chung là một ý tưởng tồi. Thay vào đó, hãy sử dụng 'find'.

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

Tại sao bạn không nên phân tích cú pháp đầu ra của ls


Trên máy tính của tôi, tôi cần sử dụng đường dẫn đầy đủ đến adb, nhưng nếu không thì điều này hoạt động tốt!
Dan J

Câu trả lời này thực sự khá thông minh. Làm tốt lắm!
Darth Egrerious

6

Mặc dù adb pulllệnh bắt đầu chấp nhận tên thư mục cho tham số từ xa, tôi vẫn thích sử dụng tarlệnh hơn. Nó cung cấp tính linh hoạt hơn - cho phép các mẫu tên tệp (cả bao gồmloại trừ ), kiểm soát liên kết biểu tượng, duy trì quyền đối với tệp. Kể từ Android 6.0, bạn có thể sử dụng cài sẵn. Trước đó, bạn phải sử dụng các công cụ của bên thứ 3 như busybox:

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

Đảm bảo bỏ qua phần dẫn đầu /trong con đường của bạn.


Ồ, nó không hoạt động. tar -tvf cho tôi biết rằng kết quả không giống như một kho lưu trữ tar. Ồ tốt.
themuddler

Cách rất mạnh! Nhưng vấn đề là các lỗi / cảnh báo như "tar: xóa hàng đầu '/' khỏi tên thành viên" được thêm vào tệp đầu ra. Không biết làm thế nào để loại bỏ điều này.
x'ES

Tôi nhận được tệp 1.5KB trên đầu ra.
Shayan

5

Tôi đã tạo hộp này cho Windows, Rất hữu ích để chuyển tệp bằng ký tự đại diện mà không cần gắn hệ thống tệp. Bạn có thể đưa tập lệnh này vào đâu đó trong env đường dẫn của mình.

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

Thí dụ: adbpull /sdcard/DCIM/Camera/IMG_2016*



3

Kéo thư mục có sẵn trên các công cụ Android mới. (Tôi không biết nó được thêm vào từ phiên bản nào, nhưng nó hoạt động trên ADT 21.1 mới nhất)

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

dựa trên câu trả lời của David, tôi thấy điều này sẽ tốt hơn một chút:

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

Ngoài việc nó là một ký tự ít hơn để nhập (vấn đề lớn), nó không chuyển đổi -rthành một khoảng trắng. Đây là một sự khác biệt đáng kể, như thể bạn cố gắng làm

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

bạn sẽ gặp lỗi khi nói

remote object '/foo/myFile1 ' does not exist

Thay vào đó, bạn có thể làm điều này, cách này sẽ hoạt động:

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

0

Thẻ Wild hoạt động trong trường hợp của tôi, tôi đã sử dụng tập lệnh đơn giản sau để nhập Hình ảnh Whatsapp của thiết bị ảo vào máy tính để bàn của tôi

#! /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

Bạn sử dụng ký tự đại diện cho cp trên Android chứ không phải để kéo trên máy chủ lưu trữ, đó là lý do tại sao nó hoạt động. Thay thế tốt, mặc dù sao chép vào / sdcard / tốn thêm bộ nhớ và rò rỉ các tệp riêng tư vào sdcard.
user905686

0

PowerShell:

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


-3

Trong Android, có một số thư mục có các quyền liên quan! Một số thư mục thuộc về người dùng gốc hoặc hệ thống.

Các bạn nên thay đổi quyền của các tập tin, thư mục đó trước khi thực hiện "kéo adb".

Các lệnh sau có thể giúp:

adb shell
su
chmod -R 777 target_folder
exit
...
adb pull /.../target_folder/ . (current local folder)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.