adb使用管道符时出现cp cannot stat无文件或目录错误如何解决
核心原因
你遇到的报错本质是管道、重定向符号默认在本地Ubuntu shell解析,没有传递到手机端执行:
- 你写的带
|、>的命令中,只有adb shell后面紧跟的第一个命令会发送到手机运行,后续的管道、重定向逻辑都在你本地Ubuntu上执行,本地没有/mnt/shared/Pictures路径,自然会报文件不存在。 - 直接写全路径的
adb shell cp命令因为没有管道/重定向,整条命令都在手机端执行,所以能正常运行。
解决方法
把所有需要在手机端执行的命令逻辑用单引号整体包裹,作为adb shell的参数传入即可,这样整串命令的解析、执行都发生在手机端。
场景1:复制asd开头的文件为kkk开头
正确命令:
adb shell 'busybox find /mnt/shared/Pictures -name "asd*" | sed -e "p" -e "s/asd/kkk/" | xargs -n 2 cp'
注意:find的通配符参数asd*必须加引号,避免被本地Ubuntu shell提前展开。
场景2:将find结果写入ddr.txt
管道重定向写法
adb shell 'busybox find /mnt/shared/Pictures -name "asd*" > /mnt/shared/Pictures/ddr.txt'
-exec写法
adb shell 'busybox find /mnt/shared/Pictures -name "asd*" -exec echo {} > /mnt/shared/Pictures/ddr.txt \;'
兼容带空格的文件名(可选)
如果后续需要处理带空格的文件名,可以用-print0+-0参数规避分隔符问题:
adb shell 'busybox find /mnt/shared/Pictures -name "asd*" -print0 | sed -z -e "p" -e "s/asd/kkk/" | xargs -0 -n 2 cp'
内容的提问来源于stack exchange,提问作者James Kim
相关产品推荐
相关产品推荐

