问题描述
希望通过 adb push
命令从 Linux 系统将超过120K个小文件(包括符号链接)推送至 Android 设备。然而,如果某个符号链接在推送到设备时失败,则会收到“remote symlink failed: Permission denied”的错误提示。
解决方案
方案1:忽略错误并继续
如果你并不关心 adb push
传输过程中出现的权限问题,并且这些文件或文件夹大多可被目标 Android 设备接受,可以选择通过以下命令忽略符号链接错误并继续推送其他文件:
adb push /path/to/source/dir /path/to/destination -e "echo \$? | grep -vE '256|307'"
此命令会忽略返回码 256
或 307
所对应的错误,该代码通常表示符号链接相关的错误。请注意,这种方法可能会导致部分文件未被正确传输至设备中。
方案2:使用 tar 并过滤符号链接
另一种解决方法是首先将需要推送的文件(包括目录)打包成一个单独的 .tar
文件,并在 adb push
上进行解压缩以便于将这些文件推送到目标 Android 设备。这里我们可以利用 find
在本地系统中直接排除(或包含)特定类型的文件,如符号链接:
# 创建 tar 包并仅包括非符号链接文件
find /path/to/source/dir -type f ! -lname -print0 | xargs -0 tar rf /path/to/tarfile.tar
# 将 tar 文件推送到设备中
adb push /path/to/tarfile.tar /mnt/sdcard/
# 在设备上解压缩 tar 包
adb shell sh -c "cd /mnt/sdcard/; tar xf /mnt/sdcard/tarfile.tar"
这种方法虽然需要一点额外步骤,但不会影响整体文件的完整性和一致性。此外,我们利用 tar
和 find
的结合,仅推送可读和有效的对象。
方案3:通过 adb exec-in 推送 tar 文件
可以先将需要推送的所有非符号链接文件打包成一个压缩包,并使用 adb exec-in
将该 tar.gz
文件推送到目标设备中。然后在 Android 环境内对其进行解压或进一步处理。
-
在 Linux 侧创建一个
.tar.gz
包:
sh
tar -czvf /path/to/tarfile.tar.gz --dereference /path/to/source/dir -
使用
adb exec-in 执行 tar xvf
命令在设备上解压 .tar.gz 文件:sh
adb shell "cd /mnt/sdcard/; tar -xvzf /mnt/sdcard/tarfile.tar.gz"
通过这种方法,可以更高效地一次性解决大量文件的传输问题。
方案4:使用第三方工具
若以上方案皆未能满足需求,则可考虑在开发环境中使用如 scp
搭配 adb forward
或者直接选择其他文件传输方法,比如使用 SSH 服务(前提为 Android 设备支持)进行更便捷和灵活的文件传输。
请注意检查设备上是否存在足够的存储空间以及是否开启相应的权限。以上任何脚本均需要根据具体场景进行适当调整以保证其按预期工作。