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

Ham*_*mza 12 wc

我想计算所有/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)


Ser*_*nyy 8

隔离文件并对它们运行 wc

什么wc -l /etc/*做的是,*将扩大到内的所有物品/etc/目录。因此,目标是隔离文件并对其执行wc。有几种方法可以做到这一点。

for 循环测试

该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应该成为处理文件以避免处理困难文件名的习惯的一部分。有关更多信息,请阅读文章如何正确处理文件名


Rap*_*ael 5

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)

  • `-iname '*'` 的目的是什么?默认情况下,`find` 不匹配所有内容吗? (4认同)