我想计算所有/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
告诉它查找常规文件,或(用-o
flag 表示)查找符号链接(用 表示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-shell(zsh
),贝壳女王,而不是 bash。
sudo wc -l /etc/*(.) | tail -1