Извлечение файлов ADB из /data/data не удается из-за символических ссылок. Как пропустить символические ссылки в ADB?

Я могу бегать

adb pull /data/data/com.xlythe.saolauncher/databases ./

или

adb pull /data/data/com.xlythe.saolauncher/files ./

и это работает нормально. Однако, если я попытаюсь

adb pull /data/data/com.xlythe.saolauncher ./

Вылетает с ошибкой:

adb: ошибка: не удалось скопировать '/data/data/com.xlythe.saolauncher/lib' в './com.xlythe.saolauncher/lib': удаленный Нет такого файла или каталога

Это происходит потому, что libпапка на самом деле является символической ссылкой на/data/app-lib/com.xlythe.saolauncher

Теперь, если бы я хотел com.xlythe.saolauncher, я бы просто сделал это вручную, копируя одну папку за раз, но вместо этого я хочу вытащить все /data/dataсразу.
Поэтому мне нужен способ сказать ADB просто пропускать символические ссылки вместо сбоя копирования.
Любые подсказки?

Ответы (1)

Способ 1:

Если вы не против получить выходной файл в виде .tarархива, попробуйте следующую команду:

adb exec-out tar c data/data > data_backup.tar

Не забудьте опустить ведущий /в своем пути. ( Источник )

Способ 2:

Если вы хотите копировать пофайлово, используйте следующий скрипт, написанный мной:

#!/bin/bash
## Run as: ./filename.sh <source_folder> <destination_folder>
## If no <destination_folder> is provided, it's stored in current directory.

location=$1
if [ -z "$2" ]
  then
    destination=.
else
  destination=$2
fi

## Find the full path of all the files in the given directory, and retrieve each file one by one

while read line
do
  ## Create the directory where the file will reside, by removing the filename alone from the fullpath.
  ## Thanks to https://stackoverflow.com/a/9022471/5002496
  mkdir -p $destination"${line%/*}"
  adb pull $line $destination$line
done <<< `adb shell find $location -type f`

## The find binary in Android doesn't seem to show symlinks when '-type f' option is used.
## Source: https://stackoverflow.com/a/16303559/5002496

Сохраните его как adb_pull.sh, запустите chmod 777 adb_pull.shи запустите как:

./adb_pull.sh /данные/данные data_backup

Все содержимое с /data/dataустройства Android будет сохранено в data_backupпапку.
( Примечание : НЕ указывайте исходную папку, например /data/data/, с дополнительным /после имени папки)

Протестировано и работает на моем Ubuntu 17.04 с использованием устройства Android 7.1.
Примечание. Чтобы /dataполностью получить доступ к разделу через ADB, вам необходимо запустить adb root. ( больше помощи ..)

+1 Мне пришлось присоединиться к этому сайту только для того, чтобы проголосовать за этот ответ (метод 1), который мне действительно помог. :)
Создание tarархива может завершиться ошибкой из-за объединения stdout и stderr. adb shell 'tar -cf - data 2>/dev/null' | gzip -9 > backup.tar.gzВместо этого попробуйте .