ADB

ADB Pull and Push: Command-Line File Transfer for Android

Published: June 30, 2026 Applies to: All Android versions — Windows, macOS, Linux

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.

Why ADB File Transfer Over MTP

MTP (Media Transfer Protocol) is convenient for casual file browsing but fails in several specific situations:

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.

Setup Requirements

ADB must be installed on the PC and USB Debugging must be enabled on the Android device. If you have not done this:

  1. Download Android Platform Tools from developer.android.com/tools/releases/platform-tools and extract to a folder.
  2. On the phone: Settings > About Phone > tap Build Number 7 times > Settings > Developer Options > enable USB Debugging.
  3. Connect via USB, tap Allow on the phone when the authorization dialog appears.
  4. Verify:
    adb devices
    The device should appear with status device.

adb pull: Copying Files from Android to PC

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

adb push: Copying Files from PC to Android

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.

Android Path Conventions

Understanding where files live on Android is important before using ADB file transfer:

Preserving Timestamps with -a

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.

Progress Output and Speed

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".

Common Errors

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).