Não incomum, eu tenho que contar o número de arquivos em um diretório, às vezes isso chega a milhões.
Existe uma maneira melhor do que apenas enumerá-las e contá-las find . | wc -l
? Existe algum tipo de chamada do sistema de arquivos que você pode fazer no ext3 / 4 que consome menos E / S?
linux
filesystems
find
ext4
MattPark
fonte
fonte
find -maxdepth 1
. Observe que, com sua abordagem atual, você contará duas vezes qualquer nome que contenha um caractere de nova linha.Respostas:
Não é uma aceleração fundamental, mas pelo menos algo :)
Você realmente não precisa passar a lista de nomes de arquivos, apenas as novas linhas são suficientes. Essa variante é cerca de 15% mais rápida no meu Ubuntu 12.04.3 quando os diretórios são armazenados em cache na RAM. Além disso, essa variante funcionará corretamente com nomes de arquivos contendo novas linhas.
Curiosamente, essa variante parece ser um pouco mais lenta que a acima:
Caso especial - mas muito rápido
Se o diretório estiver em seu próprio sistema de arquivos, você pode simplesmente contar os inodes:
Se o número de diretórios e arquivos em outros diretórios que não o contado não mudar muito, basta subtrair esse número conhecido do
df -i
resultado atual . Dessa forma, você poderá contar os arquivos e diretórios muito rapidamente.fonte
time find /usr/src/ -printf \\n | wc -l
, você pode limpar os caches entre as execuções comsudo sync && sudo sysctl -w vm.drop_caches=3
-printf x
para ser o mesmo que-printf '\0'
? Não o vejo mencionado nos documentos.-printf
funciona de maneira semelhante àprintf()
função em C, com a principal diferença de que as%
diretivas têm um significado diferente. A ação é invocada para cada arquivo encontrado. Isso significa que-printf x
imprimirá o caracterex
para cada arquivo encontrado (tente!) E-printf '\0'
imprimirá o caractere NULL (código ASCII 0) para cada arquivo encontrado.-printf '\0'
não tem significado especial. Ambos funcionarão da mesma forma no exemplo comwc -c
nesta resposta.Eu escrevi ffcnt exatamente para esse fim. Ele recupera o deslocamento físico dos próprios diretórios com o
fiemap
ioctl e, em seguida, agende a passagem do diretório em várias passagens sequenciais para reduzir o acesso aleatório. A obtenção de uma aceleração comparada com afind | wc
depende de vários fatores:fiemap
ioctl, serão os mais beneficiados(re) montar com
relatime
ou aténodiratime
também pode melhorar a velocidade (para todos os métodos) quando os acessos causariam atualizações de metadados.fonte
Na verdade, no meu sistema (Arch Linux) esse comando
é mais rápido que todos os itens acima:
fonte
/bin/ls: Argument list too long
se você usar globbing, mas, novamente, pode operar recursivamente como o find também, então talvez seja algo a considerar, não use o find se não for necessário.ls -A
liste apenas os arquivos no diretório atual enquantofind
sem-maxdepth 1
argumento fará uma pesquisa recursiva em todos os subdiretórios.