Answers:
什么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将它们解释为find
command的一部分,而不是其他内容。-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 -1
LD James的回答一样,使用起来更容易,但是find
应该成为处理文件以避免处理困难的文件名的习惯的一部分。有关该信息的更多信息,请阅读文章如何正确处理文件名
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
-iname '*'
什么?find
默认情况下不匹配所有内容?
'*'
。