Android中使用cp命令复制目录提示Cross-device link问题排查与解决
解决cp命令"Cross-device link"错误(同一data卷场景)
错误原因
即使源目录/data/data/com.vivaldi.browser/app_chrome/和目标目录/data/local/tmp/zip/都在data卷下,仍触发跨设备链接错误,大概率是以下两种情况:
/data/local/tmp是**tmpfs(内存文件系统)**挂载的,它的设备ID和实际存储/data的物理设备不一致,cp命令检测到设备号不同,判定为跨设备。- 目标目录是通过bind mount创建的挂载点,这种情况下挂载点的设备属性和原路径不一致,也会被cp识别为不同设备。
另外,cp默认尝试用硬链接的方式复制文件(尤其是目标目录已存在时),而硬链接不支持跨设备,这也是报错的直接触发点。
解决方法
方法1:使用递归复制参数,强制复制文件而非硬链接
直接给cp加上-a参数(归档模式,递归复制并保留权限、属性等),或者-r参数(仅递归复制),同时如果目标目录已存在,建议将源目录内的内容复制到目标目录下:
# 复制源目录内所有内容到目标目录 cp -a /data/data/com.vivaldi.browser/app_chrome/. /data/local/tmp/zip/
如果目标目录zip还未创建,直接执行以下命令会自动创建目标目录并完整复制源目录:
cp -a /data/data/com.vivaldi.browser/app_chrome/ /data/local/tmp/zip/
方法2:先清空目标目录再复制
如果目标目录已有内容,先删除目标目录再重新复制,避免cp尝试硬链接已存在的文件:
rm -rf /data/local/tmp/zip/ && cp -a /data/data/com.vivaldi.browser/app_chrome/ /data/local/tmp/zip/
方法3:使用rsync替代cp(可选)
如果cp还是有问题,rsync对跨设备复制的兼容性更好,同样支持一次性复制多个文件/目录:
rsync -a /data/data/com.vivaldi.browser/app_chrome/ /data/local/tmp/zip/
内容的提问来源于stack exchange,提问作者Ivan
相关产品推荐
相关产品推荐

