gpt4 book ai didi

bash - 计算有多少文件在最后一行包含一个字符串

转载 作者:行者123 更新时间:2023-11-29 09:37:34 26 4
gpt4 key购买 nike

我想统计当前目录中有多少个文件在最后一行有字符串"A"

第一个解决方案:tail -n 1 * | grep\"A\"| wc -l

这工作正常,但是当有更多文件时它会 bash:/usr/bin/tail: Argument list too long。有办法解决吗?

如果我还可以选择获取包含它的哪些文件,则可获得加分。

编辑:我的文件夹包含 343729 个文件

EDIT2:@tso 有用地指出了文章 I'm getting "Argument list too long". How can I process a large list in chunks?在他的评论中。

结果:

@tso 解决方案 for f in $(find . -type f);做 tail -1 $f|grep\"A\"; done|wc -l 大约需要 20 分钟

@lars 解决方案 grep -P "\"A\"*\Z"-r 。 | wc -l 大约需要 20 分钟

@mklement0 解决方案 printf '%s\0' * | xargs -0 sh -c 'tail -q -n 1 "$@"| grep\"A\"' - | wc -l 大约需要 10 分钟

@james 解决方案(在评论中)for i in * ;做 awk 'END{if(/a/)print FILENAME}' "$i";完成大约需要 25 分钟

@codeforester 找到。 -type f -exec tail -n 1 -- {} + | grep -EB 1 '^[^=]+A' | grep -c '^==>' 需要 >20 分钟。

@mklement0 和@codeforester solutiona 还有一个优点,如果我想更改 grep 模式,我第二次运行它需要零时间,我猜这是由于某种缓存。

我已经接受了@mklement0 的回答似乎是最快的,但我仍然想提及@tso 和@lars 的贡献,并且根据我个人的知识,这是一个更简单且适应性强的解决方案。

最佳答案

  • xargs 能够克服最大值。通过有效地将调用分成尽可能少的调用来限制命令行长度。

  • Shell 的内置,例如printf不受限制。命令行长度。

了解这一点后,您可以使用以下方法(假设您的 xargs 实现支持 NUL 终止输入的 -0 选项,并且您的 tail 实现支持多个文件操作数和用于抑制文件名 header 的 -q 选项。
这两个假设都适用于这些实用程序的 GNU (Linux) 和 BSD/macOS 实现:

printf '%s\0' * | xargs -0 sh -c 'tail -q -n 1 "$@" | grep \"A\"' - | wc -l

关于bash - 计算有多少文件在最后一行包含一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44226533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com