使用 wc 计算行数时,只要是目录,就不会打印错误

使用 wc 计算行数时,只要是目录,就不会打印错误

我想计算所有/etc文件的总行数,但不计算子目录中的文件的总行数,因此我输入:wc -l /etc/* | tail -1输出如下:

xxxx is a directory 
yyyy is a directory
total 1752

我的问题是,我怎样才能摆脱(删除)这些评论,有没有更好的方法来进行这种计数?

答案1

您可以将错误消息输出到/dev/null

$ wc -l /etc/* 2>/dev/null | tail -1

使用此命令,您只能看到文件中可供所有人读取的行数。要查看所有文件的行数,您必须使用 提升命令的权限sudo

$ sudo wc -l /etc/* 2>/dev/null | tail -1

答案2

隔离文件并对其运行 wc

wc -l /etc/*这样做的目的是*将扩展到/etc/目录内的所有项目。因此,目标是隔离文件并wc对其进行操作。有几种方法可以做到这一点。

带测试的 for 循环

test命令(或更常见的缩写)[可用于查找某个项目是否为常规文件,如下所示:

[ -f "$FILE" ]

因此,我们可以做的是遍历所有项目,并且当且仅当上述命令返回 true 时才对它们/etc/运行。如下所示:wc

for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done             

寻找

我们还可以find使用-maxdepth-type-exec标志

find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +

  • -maxdepth告知 find 在目录结构中要查找的深度;值 1 表示仅查找我们想要的目录中的文件。
  • -type f 告诉它查找常规文件,或(用-oflag 表示)查找符号链接(用 表示type l)。所有这些优点都包含在用 转义的括号中()\以便 shell 将它们解释为find命令 的一部分,而不是其他内容。
  • -exec COMMAND {} +这里的结构运行我们给出的任何命令,+表示获取所有找到的文件并将它们作为命令行参数填充到命令中。

为了得出总数,我们可以通过管道将输出传输到tail像这样

$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1           
[sudo] password for xieerqi: 
 11196  total

边注

更简单的方法是直接使用wc -l /etc/* 2>/dev/null | tail -1,就像 LD James 的回答中说的那样,但是find应该养成处理文件的习惯,以避免处理困难的文件名。有关更多信息,请阅读文章如何正确处理文件名

答案3

find很容易做到:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*')

输出:

...
828 /etc/mime.types
25 /etc/ts.conf
66 /etc/inputrc
 0 /etc/subgid-
8169 total

如果你只想要号码作为输出,仅此而已:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | grep total | awk '{print $1}'

编辑newlines错误科斯所述为准。仅使用-exec即可纠正。此外,/etc不包含此类文件。

输出:

8169

正如所指出的科斯,上述命令可以简化为:

sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | awk 'END {print $1}'

编辑newlines错误科斯所述为准。仅使用-exec即可纠正。此外,/etc不包含此类文件。

输出:

8169

答案4

使用z-shellzsh),贝壳女王,而不是 bash。

sudo wc -l /etc/*(.) | tail -1

相关内容