gpt4 book ai didi

shell - 为什么 wc 实用程序会生成多行 "total"?

转载 作者:行者123 更新时间:2023-12-04 14:07:07 25 4
gpt4 key购买 nike

我在从 Cygwin 运行的 shell 脚本中使用 wc 实用程序,我注意到它的输出中有不止一行带有“total”。

以下函数用于计算我的源文件中的行数:

count_curdir_src() {
find . '(' -name '*.vb' -o -name '*.cs' ')' \
-a '!' -iname '*.Designer.*' -a '!' -iname '.svn' -print0 | \
xargs -0 wc -l
}

但它对某个目录的输出如下所示:
$ find . '(' -name '*.vb' -o -name '*.cs' ')' -a '!' -iname '*.Designer.*' -a '!' -iname '.svn' -print0 | xargs -0 wc -l
19 ./dirA/fileABC.cs
640 ./dirA/subdir1/fileDEF.cs
507 ./dirA/subdir1/fileGHI.cs
2596 ./dirA/subdir1/fileJKL.cs
(...many others...)
58 ./dirB/fileMNO.cs
36 ./dirB/subdir1/filePQR.cs
122200 total
6022 ./dirB/subdir2/subsubdir/fileSTU.cs
24 ./dirC/fileVWX.cs
(...)
36 ./dirZ/Properties/AssemblyInfo.cs
88 ./dirZ/fileYZ.cs
25236 total

看起来 wc 在过程中的某个地方重置了。不能由文件名或目录名中的空格字符引起,因为我使用了 -print0选项。只有在我最大的源代码树上运行它时才会发生这种情况。

那么,这是 wc 还是 Cygwin 中的错误?或者是其他东西? wc 联机帮助页说:

Print newline, word, and byte counts for each FILE, and a total line if more than one FILE is specified.



它没有提到关于多个总行(中间总计数或其他东西)的任何内容,那么这该怪谁呢?

最佳答案

发生的事情是xargs正在运行 wc多次。 xargs默认情况下,它认为它可以将尽可能多的参数批处理到它应该运行的命令的每次调用中,但是如果文件太多,它将在文件的子集上多次运行该命令。

我看到有几种方法可以解决这个问题。第一个,如果你有太多文件会中断,跳过 xargs并使用 shell 。这在 Cygwin 上可能效果不佳,但看起来像这样:

wc -l $(find . '(' -name '*.vb' -o -name '*.cs' ')' \
-a '!' -iname '*.Designer.*' -a '!' -iname '.svn' )

并且您也失去了 print0 功能。

另一种是使用 awk (或 perl)脚本来处理 find 的输出/ xargs组合,跳过“总计”行,并自己总结总计。

关于shell - 为什么 wc 实用程序会生成多行 "total"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2501402/

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