获取最近的文件并通过 adb 删除它

Fetching most recent file and deleting it via adb

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

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

假设这个文件是 file.txt,它在 Android 设备上的 /sdcard/Android/data/my.app.package 中。

当我尝试执行 adb shell ls -t /sdcard/Android/data/my.app.package | head -1 | xargs rm -f 时,它抛出错误:

rm: file.txt: No such file or directory

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

然后我尝试 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 设备上却出现了奇怪的情况。 Android 堆栈上可能缺少 xargs 的一些实现。

这是有效的解决方案:

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

这样的命令
adb shell foo | bar

运行s fooadb shell 中,并有您的本地 shell 运行 bar 并从 [=15 接收其输入=].如果 bar 也应该在 adb shell 中 运行,您希望将整个管道传递给 adb shell:

adb shell 'foo | bar'

你的这部分问题基本上是重复的 How to type adb shell commands in one line?

另外,您的 ls -t 命令在几个方面存在缺陷。一般来说,don't use ls in scripts;但简单的解决方法是直接 运行 该目录中的命令。那你就不用把路径加回去了:

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

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

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'

(改编自 并修复了引号以允许整个命令 运行 在单引号内。)

如果 adb shell 不提供对 GNU 用户空间工具的访问,也许只需确保您对目录中的文件有非常详细的控制,以便您可以合理可靠地解析 [=22] 的输出=];或者,如果您不能保证这一点,请尝试破解某些内容,例如Perl.

不幸的是,没有简单的标准方法可以从目录中以可靠的机器可读形式获取最旧或最新的 n 文件。 如果有比 find.

这些可以说是复杂且稍微高级的技巧更简洁的方法,那就太好了