Quero contar o número total de linhas em todos os /etc
arquivos, mas não os arquivos nos subdiretórios, então digitei: wc -l /etc/* | tail -1
e a saída é como:
xxxx is a directory
yyyy is a directory
total 1752
Minha pergunta é: como posso remover (excluir) esses comentários e existe uma maneira melhor de fazer esse tipo de contagem?
Respostas:
Você pode enviar as mensagens de erro para / dev / null
Com este comando, você está vendo apenas o número de linhas nos arquivos que são legíveis mundialmente. Para ver o número de linhas de todos os arquivos com os quais você teria que elevar o comando
sudo
.fonte
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 executarwc
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: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:encontrar
Podemos também usar
find
com-maxdepth
,-type
e-exec
bandeirasfind /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 portype l
). Toda essa bondade é colocada entre colchetes()
com escape, de\
modo que o shell os interpreta como parte dofind
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 formaNota
É 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 corretamentefonte
find
faz isso facilmente:Resultado:
MAS se você quiser apenas o número como saída e nada mais:
EDIT :
newlines
erro kos disse prevalece. Somente o uso o-exec
retifica. Além disso,/etc
não contém esses arquivos.Resultado:
Conforme apontado por kos , o comando acima pode ser reduzido para:
EDIT :
newlines
erro kos disse prevalece. Somente o uso o-exec
retifica. Além disso,/etc
não contém esses arquivos.Resultado:
fonte
-iname '*'
? nãofind
corresponde a tudo por padrão?'*'
.Usando z-shell (
zsh
), a rainha das conchas , em vez de bash.fonte