Isolar arquivos e executar o wc neles
O que wc -l /etc/*faz é *expandir para todos os itens dentro do /etc/diretório. Assim, o objetivo é isolar arquivos e executar wcneles. Existem várias maneiras de fazer isso.
para loop com teste
O testcomando, ou abreviado com mais frequência, [pode ser usado para descobrir se um item é um arquivo comum como este:
[ -f "$FILE" ]
Portanto, o que podemos fazer é iterar sobre todos os itens /etc/e executá wc-los se e somente se o comando acima retornar verdadeiro. Igual a:
for i in /etc/*; do [ -f "$i" ] && wc -l "$i" ; done
encontrar
Podemos também usar findcom -maxdepth, -typee -execbandeiras
find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +
-maxdepthinforma a profundidade da estrutura de diretórios; O valor 1 significa apenas os arquivos no diretório que queremos.
-type f diz para procurar arquivos regulares, OU (representado por -osinalizador) por links simbólicos (representados por type l). Toda essa bondade é colocada entre colchetes ()com escape, de \modo que o shell os interpreta como parte do findcomando, em vez de outra coisa.
-exec COMMAND {} +aqui a estrutura executa qualquer comando que dermos, +indicando pegar todos os arquivos encontrados e colocá-los como argumentos na linha de comando para o COMMAND.
Para produzir o total, poderíamos canalizar a produção da tailmesma forma
$ find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} + | tail -n 1
[sudo] password for xieerqi:
11196 total
Nota
É mais fácil usar apenas wc -l /etc/* 2>/dev/null | tail -1, como na resposta de LD James, no entanto, finddeve ser parte do hábito de lidar com arquivos para evitar o processamento de nomes de arquivos difíceis. Para mais informações, leia o ensaio Como lidar com nomes de arquivos corretamente