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将它们解释为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应该成为处理文件以避免处理困难的文件名的习惯的一部分。有关该信息的更多信息,请阅读文章如何正确处理文件名
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默认情况下不匹配所有内容?
'*'。