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