adb pull and adb push are the two core ADB commands for transferring files between an Android device and a connected PC. Unlike MTP (the drag-and-drop method in Windows Explorer), ADB file transfer does not depend on Windows driver state or Android's media server, making it more reliable for large batches, scripting, and accessing paths outside of the normal shared storage. This guide covers syntax, path conventions, folder transfers, metadata preservation, and practical speed expectations.
MTP (Media Transfer Protocol) is convenient for casual file browsing but fails in several specific situations:
/data or app-private directories at all, even on a rooted phone via normal Windows Explorer.ADB file transfer consistently achieves 50–100 MB/s on USB 3.0 connections with modern devices and is not affected by Android's media server state.
ADB must be installed on the PC and USB Debugging must be enabled on the Android device. If you have not done this:
developer.android.com/tools/releases/platform-tools and extract to a folder.adb devices The device should appear with status device.Basic syntax:
adb pull <source-on-device> <destination-on-pc>
Examples:
adb pull /sdcard/DCIM/Camera/IMG_2024.jpg C:\Photos\
Pulls a single photo to the C:\Photos directory on the PC.
adb pull /sdcard/DCIM/Camera/ C:\Photos\Camera\
Pulls the entire Camera folder recursively. If the destination folder does not exist, ADB creates it. If it already exists, ADB merges the contents (it does not wipe the destination first).
adb pull /sdcard/DCIM/Camera/ .
Pulls the Camera folder into the current working directory of the terminal.
If you omit the destination, ADB places the file in the current directory:
adb pull /sdcard/Download/file.zip
Basic syntax:
adb push <source-on-pc> <destination-on-device>
Examples:
adb push C:\APKs\myapp.apk /sdcard/Download/
Copies an APK to the Download folder on the phone. Note: this does not install the APK; use adb install to install.
adb push C:\Music\ /sdcard/Music/
Pushes an entire folder. ADB creates /sdcard/Music/ on the device if it does not exist.
On Windows, use forward slashes for the device path and backslashes or forward slashes for the PC path. Both work in PowerShell and Command Prompt for the local path.
Understanding where files live on Android is important before using ADB file transfer:
/storage/emulated/0/, the user's primary shared storage. This is where Downloads, DCIM, Pictures, Music, and Documents folders live. Accessible without root./sdcard/. Use either path; they are identical./storage/1A2B-3C4D/). Find it with adb shell ls /storage/.By default, pulled files have their modification timestamp set to the time of transfer. To preserve the original file timestamps from the Android device:
adb pull -a /sdcard/DCIM/Camera/ C:\Photos\Camera\
The -a flag preserves modification time. This matters for photo libraries where sorting by date depends on file modification timestamps rather than EXIF data.
ADB shows a progress line per file and a final transfer rate summary:
5 files pulled, 0 skipped. 87.3 MB/s (1203456 bytes in 0.013s)
If you are pulling a large folder, each file prints a line. For hundreds or thousands of files, this is verbose. ADB does not have a quiet mode for pull/push, but you can redirect output:
adb pull /sdcard/DCIM/ C:\Photos\ 2>&1 | findstr /i "pulled\|skipped\|error"
This filters the output to show only the summary lines and any errors. On macOS/Linux, replace findstr with grep -iE "pulled|skipped|error".
adb: error: failed to stat remote object: No such file or directory — The source path on the device does not exist or is misspelled. Use adb shell ls /sdcard/ to browse the device filesystem and confirm the exact path.
remote open failed: Permission denied — You are trying to access a protected path (typically under /data/) without root. On a non-rooted device, this is not solvable through ADB alone.
Transfer stalls at 0 bytes/s — The USB cable or port is faulty, or the Android USB mode is set to Charging Only. Pull down the notification shade on the phone, tap the USB notification, and change from No data transfer to File Transfer or leave on No data transfer (ADB works in any USB mode; if stalling occurs, try toggling USB Debugging off and on in Developer Options).