在所有子目录上使用wc命令计算行数总和。

69
如何使用wc命令计算所有子目录中所有文件的行数?
cd mydir
wc -l *
..
11723 total

man wc 建议使用 wc -l --files0-from=-,但我不知道如何生成所有文件的 NUL-terminated names 列表。

find . -print | wc -l --files0-from=-

没有起作用。


5
这个命令“find . -name '*'|xargs wc -l”可能会有帮助。 - axiom
7个回答

117

您可能想要这个:

find . -type f -print0 | wc -l --files0-from=-
如果你只想要总行数,可以使用
find . -type f -exec cat {} + | wc -l

7
我使用了 find . -type f -print0 | wc -l --files0-from=- 命令,它运行良好并在结尾返回总数。 - Jonas Stein
3
在Mac上,第一次运行出现:wc: illegal option -- - - Geoff Langenderfer
在macOS 12.7上,wc不支持--files0-from选项,因此会出现@GeoffLangenderfer提到的错误。 - undefined

9
也许您正在寻找find命令的exec选项。
find . -type f -exec wc -l {} \; | awk '{total += $1} END {print total}'

4
这样做效率低下,因为你为每个文件都开启了一个新的 wc 进程。 :-( - gniourf_gniourf
6
如果你有这样的一个文件,那么这个程序就会完全崩溃:尝试输入命令 touch $'hello\n1000000',惊喜吧!请注意保留原意并使翻译通俗易懂。 - gniourf_gniourf

7

要计算特定文件扩展名的所有行数,可以使用以下方法:

find . -name '*.fileextension' | xargs wc -l

如果您想在两个或更多不同类型的文件上使用,可以使用 -o 选项。

find . -name '*.fileextension1' -o -name '*.fileextension2' | xargs wc -l

5
这会在文件名中含有空格或 \ 的情况下出现错误。请参考被接受的答案来正确使用这种方法。 - terdon
喜欢这个解决方案,即使在所有情况下显然都不足够。对我的目的来说非常有效。 - wetjosh

4

另一种选择是使用递归grep:

grep -hRc '' . | awk '{k+=$1}END{print k}'

awk 简单地将数字相加。使用的 grep 选项为:
   -c, --count
          Suppress normal output; instead print a count of matching  lines
          for  each  input  file.  With the -v, --invert-match option (see
          below), count non-matching lines.  (-c is specified by POSIX.)
   -h, --no-filename
          Suppress the prefixing of file names on  output.   This  is  the
          default  when there is only one file (or only standard input) to
          search.
   -R, --dereference-recursive
          Read all files under each directory,  recursively.   Follow  all
          symbolic links, unlike -r.

因此,grep 会计算与任何内容('')匹配的行数,因此本质上只是计算行数。

1

我建议使用类似的东西

find ./ -type f | xargs wc -l | cut -c 1-8 | awk '{total += $1} END {print total}'

除了目录之外的所有内容;在大多数情况下,它与“-type f”相同。 - sge
3
除了块设备节点、字符设备节点、命名管道和套接字之外,其中至少有一个将破坏整个操作......最好使用-type f参数... - twalberg

1
根据ДМИТРИЙ МАЛИКОВ的回答:
用格式化计算Java代码行数的示例:
一行代码。
find . -name *.java -exec wc -l {} \; | awk '{printf ("%3d: %6d %s\n",NR,$1,$2); total += $1} END {printf ("     %6d\n",total)}'

awk 部分:

{ 
  printf ("%3d: %6d %s\n",NR,$1,$2); 
  total += $1
} 
END {
  printf ("     %6d\n",total)
}

例子结果
  1:    120 ./opencv/NativeLibrary.java
  2:     65 ./opencv/OsCheck.java
  3:      5 ./opencv/package-info.java
        190

-2

虽然来晚了,但这个方法也可以行得通吧?find . -type f | wc -l

这会计算 'find' 命令输出的所有行数。你可以微调 'find' 命令以显示任何你想要的内容。我正在使用它来计算深层目录树中一个特定子目录下的子目录数量:find ./*/*/*/*/*/*/TOC -type d | wc -l。输出:76435。(如果不加所有星号进行查找,则会出现错误。)


1
不,我认为这会返回类似于文件数量的东西,而不是所有文件中所有行的总和。 - Jonas Stein
啊,现在明白了。是的,不会的。 :) - Cronk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接