O problema
O que você está tentando fazer? Deixe-me tentar explicar seu comando para que eu entenda:
ls -Ra | grep -cve/ -e'^\.*$'
fornecerá:
- O número de arquivos, diretórios, links simbólicos, ...
- Incluindo o diretório atual
-
Excluindo arquivos com nomes consistindo apenas de pontos:
touch '...'
(!!!)
A solução
Se você quiser fazer o exatamente igual com find
, use:
find . -not -regex '^\.+$' | wc -l
Se a coisa com mais de dois pontos é um erro, é isso:
find . | wc -l
Ou (teoricamente) o caminho 'ls' usando o seguinte - fazendo com que a a
maiúscula não imprima o diretório atual e o diretório pai:
ls -RA | grep -cve/ -e^\$
Um pouco sobre o tempo
except multidots all files number of files
ls /home 0.75s 0.70s ~330000
find /home 0.50s 0.50s ~330000
ls / 2.50s 2.50s ~1350000
find / 1.90s 1.70s ~1350000
ls / [BSD] 10.00s 8.50s ~250000
find / [BSD] 7.50s 7.50s ~250000
Você pode ver, encontrar é praticamente sempre mais rápido. Mas ainda não o otimizamos!
Adicionar a opção -f
a ls
ignora a classificação e, assim, acelera o processo em aproximadamente 30% (gerando 1,60s para /
), tornando ls -RAf | grep -cve/ -e^\$
o mais rápido de os comandos. No entanto, parece não fazer nada no FreeBSD ...
É bom saber: A extrema diferença de tempo na verificação de vários pontos no BSD (neste caso, FreeBSD) provavelmente se origina principalmente da maneira como
Os tempos mais longos no BSD vs Linux provavelmente são apenas porque a máquina BSD em que eu testei isso é muito mais lenta, e talvez também porque está usando outro sistema de arquivos.
TL; DR
O comando mais rápido para obter o número de todos os nós do sistema de arquivos dentro de um diretório com ferramentas padrão no Linux é:
ls -RAf | grep -cve/ -e^\$
Um comando mais curto, que também é o mais rápido no FreeBSD (e, na verdade, responde à sua pergunta) é:
find . | wc -l