在 wc 之前使用 find 消除 total

在 wc 之前使用 find 消除 total

我使用 find 搜索所有子目录和当前目录以查找所有 .py 文件,然后运行 ​​wc -l 查找行数。但是,当我将 find 与 wc 一起使用时,Total 字段被忽略,这与单独运行 wc 时不同。有人知道为什么会发生这种情况吗?

find . -name \*.py -exec wc -l {} \;
  187 ./check.py
   43 ./file.py
   33 ./mitch.py
       ...
 1014 ./serve.py
   41 ./test_scripts/line_graph.py
   39 ./welcome.py

但没有总数,但是当我wc -l *.py在目录中运行时我得到了总数:

wc -l *.py
 187 check.py
  43 file.py
  94 log_com.py
 154 log_results.py
  33 mitch.py
1014 serve.py
  39 welcome.py
1564 total

答案1

wc仅输出全部的当使用多个文件作为参数调用它时的值。

来自GNU 手册

如果给出了多个文件,wc则打印包含累积计数的最后一行,并带有文件名total

就你的情况而言,你不能得到全部的输出,因为您wc对找到的每个文件调用一次,所以每个后续wc调用都不知道前一个调用。


如果您仍然想要总数,您可以使用globstarBash 中的选项递归到目录并列出.py文件:

shopt -s globstar
wc -l **/*.py

或者,正如 grawity 所建议的那样,使用 GNUfind-exec command {} +选项,替换find中找到的所有路径{},而不是单独调用每个路径(尽管它可以替换的文件数量是有限的,就像 glob 方法一样)。

答案2

没有total字段,因为只有一个文件。

随着行动,运行-exec command {} ;find命令 每个文件一次,每次只添加一个参数。因此每次wc调用都无法计算总数。

如果您有 GNU 则必须使用;否则您需要将文件列表通过管道传输到。-exec command {} +findxargs command

(在这个答案中,我不会理会通常的-print0建议,因为如果你没有 GNU find,你也不会有-print0甚至 GNU xargs。但是,如果你的 xargs 版本支持-d '\n',使用它,因为 xargs 解析输入的默认方式不是很安全。)

请注意,这可能仍会导致多次wc调用,因为大多数操作系统(也许 Hurd 除外)对最大命令行长度和/或单个命令的最大参数数量都有限制,而大量文件可能会超过这个限制。@slhck 的建议使用**/*.py也会达到同样的限制(早期的 Unix 具有非常低的限制,这就是xargs首先创建的原因)。

另一种方法是使用awk以下方法进行最终计算:

find ... | awk '$2 != "total" {sum += $1; print}
                END {printf "%7d total\n", sum}'

相关内容