-2

我正在尝试通过adb(这是用于自动脚本)在我的 Android 设备上进行管道操作。

该操作是获取特定目录中最近修改的文件,然后将其删除。

让我们说这个文件是file.txt并且它在/sdcard/Android/data/my.app.packageAndroid 设备上。

当我尝试这样做adb shell ls -t /sdcard/Android/data/my.app.package | head -1 | xargs rm -f时会引发错误:

rm: file.txt: 没有这样的文件或目录

这是因为它需要完整的路径。

所以然后我尝试ls -t /sdcard/Android/data/my.app.package | head -1 | xargs ls -d | xargs rm -f了,但它抱怨同样的错误。

也许我需要将$PWD文件名连同文件一起传递给xargs. 我该怎么做,或者有更好的方法吗?

编辑:我现在已经尝试过ls -t sdcard/Android/data/my.app.package | head -1 | xargs -I '{}' ls sdcard/Android/data/my.app.package/'{}',虽然类似的命令在 Linux 系统上按预期正常工作,但它在 Android 设备上做了奇怪的事情。xargs可能在 Android 堆栈上缺少一些实现。

4

2 回答 2

1

类似的命令

adb shell foo | bar

foo在中运行adb shell,并让您的本地 shell 运行bar并从adb shell. 如果bar也应该运行adb shell,您希望将整个管道传递给adb shell

adb shell 'foo | bar'

您的这部分问题基本上是 如何在一行中键入 adb shell 命令的副本?

另外,您的ls -t命令在几个方面存在缺陷。一般不要ls在脚本中使用;但微不足道的解决方法是直接在该目录中运行命令。然后你不需要重新添加路径:

adb shell 'cd /sdcard/Android/data/my.app.package &&
           ls -t | head -1 | xargs rm -f'

这仍然受到解析ls输出的各种变幻莫测的影响;可能更好的解决方案是find改用。如果您find在远程设备上有 GNU 和相关实用程序的功能,请尝试

adb shell 'find /sdcard/Android/data/my.app.package -printf "%T@ %p\\0" |
           sort -r -z -n | head -z -n 1 | sed "s/^[^ ]* //" | xargs -0 rm'

(改编自https://stackoverflow.com/a/299911/874188引用修复以允许在单引号内运行整个命令。)

如果adb shell不提供对 GNU 用户空间工具的访问权限,也许只需确保您对目录中可以放置哪些文件有非常详细的控制,以便您可以合理可靠地解析来自ls;的输出。或者,如果您不能保证,请尝试在 Perl 中破解一些东西。

不幸的是,没有简单的标准方法可以从目录中以健壮的、机器可读的形式获取最旧或最新的n 个文件。如果有一种比这些可以说是复杂且稍微高级的技巧更简洁的方法,那就太好了find

于 2021-09-30T12:57:31.967 回答
0

这是有效的解决方案:

adb shell ls /sdcard/Android/data/my.app.package/`adb shell ls -t /sdcard/Android/data/my.app.package | head -1` | adb shell xargs rm -f
于 2021-09-30T11:51:53.033 回答