Isole arquivos e execute wc neles
O que wc -l /etc/*
faz é que *
será expandido para todos os itens dentro do diretório /etc/
. Assim, o objetivo é isolar arquivos e executar wc
neles. Existem várias maneiras de fazer isso.
para loop com teste
O comando test
, ou mais freqüentemente abreviado como [
, pode ser usado para descobrir se um item é um arquivo regular como este:
[ -f "$FILE" ]
Assim, o que podemos fazer é iterar todos os itens em /etc/
e executar wc
neles se, e somente se, o comando acima retornar verdadeiro. Assim:
for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done
encontrar
Também podemos usar find
com -maxdepth
, -type
e -exec
flags
find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +
-
-maxdepth
informa como a estrutura do diretório deve ser usada; valor de 1 significa apenas os arquivos no diretório que desejamos.
-
-type f
diz para procurar arquivos regulares, OR (representado por -o
flag) para links simbólicos (representados por type l
). Toda essa bondade é colocada entre parênteses ()
escape com \
, de modo que o shell interpreta-os como parte do comando find
, em vez de outra coisa.
-
-exec COMMAND {} +
structure aqui executa qualquer comando que dermos, +
indicando para pegar todos os arquivos encontrados e preenchê-los como argumentos da linha de comando para o COMMAND.
Para produzir o total, poderíamos canalizar a saída para tail
da mesma forma
$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1
[sudo] password for xieerqi:
11196 total
Anotação lateral
É mais fácil usar apenas wc -l /etc/* 2>/dev/null | tail -1
, como em
Resposta de L. D. James, no entanto find
deve ser uma parte de um hábito para lidar com arquivos para evitar o processamento de nomes de arquivos difíceis. Para mais informações, leia o ensaio Como lidar corretamente com nomes de arquivos