我想计算所有/etc文件中的总行数,而不是子目录中的文件,所以我输入:wc -l /etc/* | tail -1,输出如下:
xxxx is a directory
yyyy is a directory
total 1752
Run Code Online (Sandbox Code Playgroud)
我的问题是,我怎样才能摆脱(删除)这些评论,有没有更好的方法来进行这种类型的计数?
L. *_*mes 14
您可以将错误消息输出到 /dev/null
$ wc -l /etc/* 2>/dev/null | tail -1
Run Code Online (Sandbox Code Playgroud)
使用此命令,您只能看到世界可读的文件中的行数。要查看所有文件的行数,您必须使用sudo.
$ sudo wc -l /etc/* 2>/dev/null | tail -1
Run Code Online (Sandbox Code Playgroud)
什么wc -l /etc/*做的是,*将扩大到内的所有物品/etc/目录。因此,目标是隔离文件并对其执行wc。有几种方法可以做到这一点。
该test命令或更频繁地缩写为[可用于查找项目是否为常规文件,如下所示:
[ -f "$FILE" ]
Run Code Online (Sandbox Code Playgroud)
因此,当且仅当上述命令返回 true 时,我们可以做的是迭代其中的所有项目/etc/并运行wc它们。像这样:
for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done
Run Code Online (Sandbox Code Playgroud)
我们也可以使用findwith -maxdepth, -type, 和-execflags
find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +
-maxdepth通知查找目录结构的深度;值 1 表示仅我们想要的目录中的文件。-type f 告诉它查找常规文件,或(由-o标志表示)查找符号链接(由 表示type l)。所有这些优点都包含在()转义的括号中,\以便 shell 将它们解释为 to findcommand 的一部分,而不是其他东西。-exec COMMAND {} +此处的结构运行我们给它的任何命令,+表示将所有找到的文件作为命令行参数填充到 COMMAND 中。为了产生总数,我们可以通过管道输出tail像这样
$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1
[sudo] password for xieerqi:
11196 total
Run Code Online (Sandbox Code Playgroud)
边注
wc -l /etc/* 2>/dev/null | tail -1就像在 LD James 的回答中一样,使用更容易,但是find应该成为处理文件以避免处理困难文件名的习惯的一部分。有关更多信息,请阅读文章如何正确处理文件名
find 这样做很容易:
sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*')
Run Code Online (Sandbox Code Playgroud)
输出:
...
828 /etc/mime.types
25 /etc/ts.conf
66 /etc/inputrc
0 /etc/subgid-
8169 total
Run Code Online (Sandbox Code Playgroud)
但是如果你只想要数字作为输出而不是别的:
sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | grep total | awk '{print $1}'
Run Code Online (Sandbox Code Playgroud)
编辑:newlines错误kos说占上风。只有使用才能-exec纠正它。还,/etc不包含此类文件。
输出:
8169
Run Code Online (Sandbox Code Playgroud)
正如kos所指出的,上述命令可以简化为:
sudo wc -l $(find /etc/ -maxdepth 1 -type f -iname '*') | awk 'END {print $1}'
Run Code Online (Sandbox Code Playgroud)
编辑:newlines错误kos说占上风。只有使用才能-exec纠正它。此外,/etc不包含此类文件。
输出:
8169
Run Code Online (Sandbox Code Playgroud)