Dependendo do que exatamente você deseja contar, é melhor fazer isso por sistema de arquivos em vez de contar todos os arquivos em root. A contagem de tudo em root também conta os arquivos /proc
e /sys
que você pode não querer incluir.
Para contar tudo no sistema de arquivos raiz usando o GNU find
, você poderia fazer:
find / -xdev -type f -printf '\n' | wc -l
O -printf '\n'
apenas imprimirá uma nova linha para cada arquivo encontrado, em vez do nome do arquivo. Dessa forma, não há problemas com nomes de arquivos que contenham novas linhas e contariam como vários arquivos.
Com um POSIX, você pode simplesmente fazer:
find / -xdev -type f | wc -l
Ou POSIXly e evitando que qualquer arquivo contendo novas linhas seja contado duas vezes:
{ printf 0; find / -xdev -type f -exec sh -c 'printf "+ $#"' sh {} +; echo; } | bc
Aqui cada arquivo se torna um argumento diferente para sh
, que então imprime o número total de argumentos. No caso de mais de um sh
process ser chamado, como será o caso de muitos arquivos, cada sh
output é somada em bc
.
Atualizar
Uma solução POSIX mais simples (mas mais lenta):
find / -xdev -type f -exec printf '%sfind / -xdev -type f -printf '%i\n' | sort -u | wc -l
' {} + | tr '\nfind / -xdev -type f -exec ls -iq {} + | sort -buk 1,1 | wc -l
' '?\n' | wc -l
Atualização 2
Conforme observado por @ Gilles , usando -type f
com find
apenas conta arquivos regulares. Para incluir também arquivos de dispositivo, você pode usar -type f -o -type b -o -type c
. Para contar diretórios também, não use nenhuma opção -type
.
Outro ponto de Gilles foi que os arquivos com vários links físicos serão contados como arquivos diferentes. Isso pode não ser desejável em um sistema de arquivos em que, por exemplo, as árvores de backup de incremento foram criadas ao vincular arquivos inalterados em uma árvore mais nova àqueles em uma árvore mais antiga. Para superar isso com as ferramentas do GNU, você poderia fazer:
find / -xdev -type f -printf '\n' | wc -l
Usando ferramentas POSIX:
find / -xdev -type f | wc -l
Não há problemas com novas linhas em nomes de arquivos aqui, pois a opção -q
para ls
significa que eles serão substituídos por ?
.