如何对 find 命令的每个结果运行 wc ?

如何对 find 命令的每个结果运行 wc ?

我想查看使用该命令找到的每个文件中存在多少行find

我知道我可以用来wc -l查找单个文件的行号。但是,当从以下输出进行管道传输时,这不起作用find

find -type f -name package.json | wc -l

这将返回找到的文件的计数。我想返回每个找到的文件的行数。

答案1

wcw获取其字节/字符/命令/行c计数的文件列表论点

当不带参数调用时,它会在其标准输入中报告这些字节/字符/单词/行。因此,如果您通过管道传输findwc -l,您将在 的输出中获得换行符的数量find,因此这将是找到的文件的数量加上其路径中的换行符的数量。

GNU 实现wc还可以使用该选项从文件中获取以 NUL 分隔的文件列表--files0-from,它将其视为-意义 stdin (而不是名为 的文件-),因此您可以执行以下操作:

find . -name package.json -type f -print0 |
  wc -l --files0-from=-

使用任何标准findwc实现,您都可以find传递文件路径列表作为参数wc

find . -name package.json -type f -exec wc -l {} +

但是,如果有大量匹配文件,则最终可能会运行wc多次,从而导致一行出现多次total

wctotal当给定至少 2 个文件需要处理时,会打印该行,因此要跳过该total行,您可以执行以下操作:

find . -name package.json -type f -exec wc -l {} ';'

尽管这会非常低效,因为分叉进程并为每个文件执行命令非常昂贵。

如果这是您真正感兴趣的总数,那么您会这样做:

find . -name package.json -type f -exec cat {} + | wc -l

我们将cat这些文件内容的连接提供给wc.

使用zsh和 any wc,你可以这样做:

wc -l -- **/package.json(D.)

D对于otglob 来说,也可以像dosD一样获取隐藏的,并且只包含find.常规的文件相当于-type f)。

这样做的好处是可以为您提供排序列表并避免使用前缀./

这次,如果没有或太多匹配文件,您将收到错误。

使用 GNU du,您可以通过将 NUL 分隔的 glob 扩展传递给wc -l --files0-from=-with 来避免这些问题:

print -rNC1 -- **/package.json(ND.) | wc -l --files0-from=-

另请注意,在 json 格式中,换行符(很wc -l重要)并不重要,因此我不确定这是否是您获得的有用指标。

例如,您可以返回这些文件中某些数组中的元素数量,而不是:

find . -name package.json -type f -exec \
  jq -r '[.devDependencies|length,input_filename]|@csv' {} +

(假设文件路径是 UTF-8 编码文本,此处给出 CSV 格式的结果)。

答案2

您可以使用xargs将标准输入通过管道传输到需要的参数向量中:

find -type f -name package.json | xargs wc -l

或者干脆让 shell 命令替换来填充它

wc -l $(find -type f -name package.json)

相关内容