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 wc
neles. Existem várias maneiras de fazer isso.
para loop com teste
O test
comando, 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 find
com -maxdepth
, -type
e -exec
bandeiras
find /etc/ -maxdepth 1 \( -type f -o -type l \) -exec wc -l {} +
-maxdepth
informa 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 -o
sinalizador) 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 find
comando, 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 tail
mesma 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, find
deve 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