用wc计算行数时,只要是目录,就不要输出错误


12

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

xxxx is a directory 
yyyy is a directory
total 1752

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


1
我认为使用find并不是100%正确,因为/ etc中不仅有常规文件f,而且还有链接l。所以这个版本要好得多:$ sudo wc -l / etc / * 2> / dev / null | 尾巴-1
Hamza

Answers:


14

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

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

使用此命令,您只会看到世界可读的文件中的行数。要查看所有文件的行数,您必须使用来提升命令sudo

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

8

隔离文件并在其上运行wc

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

测试循环

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通知查找要深入目录结构的深度;值1表示仅目录中需要的文件。
  • -type f 告诉它寻找常规文件,或-o寻找符号链接(由表示type l)或(由标志表示)。所有这些优点都包含在用引起来的括号内()\以便shell将它们解释为findcommand的一部分,而不是其他内容。
  • -exec COMMAND {} +这里的结构运行我们提供的任何命令,+指示将所有找到的文件作为命令行args填充到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 -1LD James的回答一样,使用起来更容易,但是find应该成为处理文件以避免处理困难的文件名的习惯的一部分。有关该信息的更多信息,请阅读文章如何正确处理文件名


5

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错误kos说占了上风。仅使用-exec纠正它。此外,/etc也不包含此类文件。

输出:

8169

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

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

编辑newlines错误kos说占了上风。仅使用-exec纠正它。此外,/etc也不包含此类文件。

输出:

8169

4
目的是-iname '*'什么?find默认情况下不匹配所有内容?
steeldriver '16

@steeldriver-没有它对我不起作用'*'
拉斐尔

2

使用z-shellzsh)(的女王)代替bash。

sudo wc -l /etc/*(.) | tail -1
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.