adb ดึงไฟล์หลายไฟล์


87

วิธีที่ดีที่สุดในการดึงไฟล์หลายไฟล์โดยใช้ไฟล์

adb pull

ฉันมี/sdcard/ไฟล์ 25 ไฟล์ที่มีชื่อต่อไปนี้:

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

สัญลักษณ์แทนไม่ทำงาน:

adb pull /sdcard/gps*.trace .

4
ฉันไม่ได้ใช้adbแต่จากเอกสารpullสามารถใช้ดึงไดเร็กทอรีทั้งหมดได้ ??? หากเป็นกรณีที่และเหล่านี้เป็นไฟล์ที่สร้างขึ้นโดย app ของคุณเองแล้วทำไมไม่เขียนพวกเขาออกไปไดเรกทอรีย่อยเช่นนั้นการใช้งาน/sdcard/mygpsfiles adb pull /sdcard/mygpsfilesจะได้ผลหรือไม่?
Squonk

2
หรือฉันเพิ่งลอง File Explorer ในDDMSมุมมองของ eclipse และสามารถเลือกไฟล์แบบหลายรายการจาก sdcard ของฉันและดำเนินการpullกับไฟล์. หากคุณไม่ใช้ eclipse DDMS จะพร้อมใช้งานเป็นเครื่องมือ SDK แยกต่างหาก
Squonk

monitorคำสั่งใช้งานได้ดีควรเข้า<sdkdir>/tools!
Santosh Kumar

คำตอบ:


142

คุณสามารถใช้xargsและผลลัพธ์ของadb shell lsคำสั่งที่ยอมรับสัญลักษณ์แทน วิธีนี้ช่วยให้คุณสามารถคัดลอกไฟล์ได้หลายไฟล์ รำคาญเอาท์พุทของคำสั่งรวมถึงการควบคุมตัวอักษรสายฟีดที่คุณสามารถเอาใช้adb shell lstr -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

4
นี่คือเวอร์ชันปรับปรุงเล็กน้อยที่สามารถจัดการช่องว่างในชื่อไฟล์: github.com/sschuberth/dev-scripts/blob/master/android/…
sschuberth

FYI: Windows และ DOS ใช้ "\ r \ n" สำหรับคู่ carriage-return / line-feed (เช่นไม่ใช่ "\ n \ r")
BrainSlugs83

3
ในกรณีของฉันมันล้มเหลวในการพยายามดึงชื่อไฟล์ (ได้รับอย่างถูกต้อง) จากไดเรกทอรีรากของ Android เพื่อแก้ปัญหาฉันใช้:adb shell "ls -d /mnt/sdcard/Pictures/Screenshots/*" | tr '\r' ' ' | xargs -n1 adb pull
rupps

4
มันใช้ไม่ได้ว่าtr ไม่รู้จักเป็นคำสั่งภายในหรือภายนอก
Suncatcher

101

adb pull สามารถรับชื่อไดเร็กทอรีแทน at file และจะดึงไดเร็กทอรีที่มีไฟล์ทั้งหมดอยู่ในนั้น

ดึงการติดตาม gps ทั้งหมดของคุณใน / sdcard / gpsTraces

adb pull /sdcard/gpsTraces/ . 

ตัวอย่างadb pullและadb 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 ล่าสุดจาก Google (ฉันใช้ 1.0.29)
Ofir Luzon

ใช่ฉันพบว่ามันใช้ได้กับโฟลเดอร์ที่ไม่ว่างเปล่าในตอนท้าย ฉันมีโฟลเดอร์ว่างบางส่วนที่ไม่ได้ดึงออกมา นอกจากนี้ดูเหมือนว่า "push" จะไม่เกิดซ้ำ?
kakyo

@kakyo ฉันได้เพิ่มผลลัพธ์ของการดึงแบบเรียกซ้ำแล้วดันไปที่คำตอบของฉัน คุณถูกต้องเกี่ยวกับโฟลเดอร์ว่างพวกเขาไม่ถูกดึงหรือผลักดัน
Ofir Luzon

1
ระวัง: เมื่อ ADB ดึงไฟล์จะสูญเสียวันที่แก้ไขต้นฉบับ
สแตน

3
@Stan: เว้นแต่คุณจะใช้ตัวเลือก "-a" เหมือนใน "adb pull [-a] <remote> ... <local>" ซึ่งตามความช่วยเหลือจะรักษาการประทับเวลาและโหมดของไฟล์
Rusty Gear

27

./adb pull /sdcard <- ล้มเหลว

./adb pull /sdcard/ <- ทำงานซ้ำ ๆ - สังเกตเครื่องหมายทับ

ทดสอบกับ Nexus 5 และ adb ที่ดาวน์โหลดเมื่อเดือนมีนาคม 2014


1
สำหรับฉันมันทำงานซ้ำ ๆ โดยไม่มีเครื่องหมายทับสุดท้าย adb เวอร์ชัน 1.0.32
อันโตนิโอ

ฉันต้องขอคืนคะแนนโหวตเพราะ @Antonio ถูกต้อง
Shayan

8

โดยทั่วไปการแยกวิเคราะห์ผลลัพธ์จาก 'ls' เป็นความคิดที่ไม่ดี ให้ใช้ "ค้นหา" แทน

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

ทำไมคุณไม่ควรแยกวิเคราะห์ผลลัพธ์ของ ls


บนเครื่องของฉันฉันต้องใช้เส้นทางแบบเต็มไปยัง adb แต่อย่างอื่นมันก็ใช้ได้ดีมาก!
Dan J

คำตอบนี้ค่อนข้างฉลาด เก่งมาก!
Darth Egregious

6

แม้ว่าadb pullคำสั่งจะเริ่มยอมรับชื่อโฟลเดอร์สำหรับพารามิเตอร์ระยะไกล แต่ฉันก็ยังชอบใช้tarคำสั่ง ให้ความยืดหยุ่นมากขึ้น - อนุญาตให้ใช้รูปแบบชื่อไฟล์ ( รวมและไม่รวม ), การควบคุม symlink, รักษาสิทธิ์ของไฟล์ ตั้งแต่ Android 6.0 คุณสามารถใช้ไฟล์. ก่อนหน้านั้นคุณต้องใช้เครื่องมือของบุคคลที่สามเช่นbusybox:

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

อย่าลืมเว้นผู้นำ/ในเส้นทางของคุณ


โอ้มันไม่ได้ผล tar -tvf บอกฉันว่าผลลัพธ์ไม่เหมือนไฟล์เก็บถาวร tar โอ้ดี.
themuddler

แรงมาก! แต่ปัญหาคือข้อผิดพลาด / คำเตือนเช่น "tar: ลบชั้นนำ" / "จากชื่อสมาชิก" ที่เพิ่มลงในไฟล์เอาต์พุต ไม่รู้จะกำจัดสิ่งนี้อย่างไร
x'ES

ฉันได้รับไฟล์ 1.5KB ในเอาต์พุต
Shayan

5

ฉันได้สร้างสิ่งนี้สำหรับกล่อง Windows มันมีประโยชน์มากในการถ่ายโอนไฟล์โดยใช้สัญลักษณ์แทนโดยไม่ต้องติดตั้งระบบไฟล์ คุณสามารถรวมสคริปต์นี้ไว้ที่ใดที่หนึ่งในเส้นทางของคุณ 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

ตัวอย่าง: 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

นอกเหนือจากการพิมพ์อักขระน้อยกว่าหนึ่งตัวแล้ว (เรื่องใหญ่) จะไม่แปลง-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

คุณใช้สัญลักษณ์แทนสำหรับ cp บน Android ไม่ใช่เพื่อดึงโฮสต์นั่นเป็นเหตุผลว่าทำไมจึงใช้งานได้ ทางเลือกที่ดีแม้ว่าการคัดลอกไปยัง / sdcard / มีค่าใช้จ่ายหน่วยความจำเพิ่มเติมและไฟล์ส่วนตัวรั่วไหลไปยัง sdcard
user905686


-3

ใน Android มีบางโฟลเดอร์ที่มีสิทธิ์ที่เกี่ยวข้อง! บางโฟลเดอร์เป็นของผู้ใช้ root หรือระบบ

พวกคุณควรเปลี่ยนสิทธิ์ของไฟล์โฟลเดอร์เหล่านั้นก่อนที่จะทำ "adb pull"

คำสั่งต่อไปนี้สามารถช่วยได้:

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.