问题描述
使用 adb pull
命令从 Android 设备拉取 /data/data
文件夹时,如果其中某些文件夹是符号链接(symlink),则会失败。例如,尝试拉取整个 /data/data
文件夹时,会因为符号链接的存在而失败。此时需要一种方法来告诉 adb pull
跳过这些符号链接,而不是直接失败。
解决方案
请注意以下操作可能需要设备root权限,请确保已经获取root权限。
方法1
如果可以接受将结果文件压缩为 .tar
归档文件,则可以使用以下命令:
adb exec-out tar c data/data > data_backup.tar
注意不要在路径前加上 /
。此方法来源于 Stack Overflow。
方法2
如果需要逐文件拉取文件,则可以使用以下脚本:
#!/bin/bash
#
# 运行示例: ./filename.sh <源文件夹> <目标文件夹>
# 如果不提供 <目标文件夹>,则默认保存在当前目录下。
location=$1
if [ -z "$2" ]; then
destination=.
else
destination=$2
fi
# 找到给定目录下的所有文件,并逐一处理
while read line
do
# 创建文件所在的目标目录,通过移除文件名来获取完整路径
mkdir -p $destination"${line%/*}"
adb pull $line $destination$line
done <<< `adb shell find $location -type f`
保存上述脚本为 adb_pull.sh
,并执行 chmod 777 adb_pull.sh
,然后运行:
./adb_pull.sh /data/data data_backup
所有 /data/data
目录下的内容将被保存到 data_backup
文件夹中。注意不要在源文件夹路径后加上 /
。
测试:此脚本已在 Ubuntu 17.04 上测试,并成功应用于 Android 7.1 设备。为了访问 /data
分区,需要先执行 adb root
命令。
注意事项:确保已获取设备root权限,否则无法访问 /data
分区。
通过以上两种方法,可以有效地解决在使用 adb pull
时遇到的符号链接问题。
正文完