Como posso contar todos os arquivos no meu sistema a partir do root?

3

Eu quero saber o número total de arquivos no meu servidor. Isso pode ser feito?

    
por fraxture 07.04.2014 / 14:59

4 respostas

6

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 '%s
find / -xdev -type f -printf '%i\n' | sort -u | wc -l
' {} + | tr '\n
find / -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 ? .

    
por 07.04.2014 / 15:56
2

df -i / fornece o número de inodes usados no sistema de arquivos raiz (em sistemas de arquivos que usam inodes, o que inclui a família ext2 / ext3 / ext4 mas não a btrfs). Esse é o número de arquivos nesse sistema de arquivos, além de alguns inodes que são pré-alocados para o uso de fsck .

Se você quiser o número de arquivos em uma árvore de diretórios, use o seguinte comando:

du -a /some/directory | wc -l

Adicione a opção -x a du se você não quiser atravessar os pontos de montagem, por exemplo, %código%. Observe que isso retornará uma contagem maior se você tiver nomes de arquivos contendo novas linhas (uma idéia ruim, mas não impossível).

Outra maneira de contar é

find /some/directory | wc -l

ou, para lidar com nomes de arquivos contendo novas linhas, com o GNU find (Linux ou Cygwin não integrado):

find /some/directory -printf . | wc -c

Adicione du -ax / | wc -l (por exemplo, -xdev ) para pular os pontos de montagem. Observe que essas entradas de diretório, não arquivos: se um arquivo tiver vários links físicos, cada link será contado (enquanto os arquivos de contagem de métodos find /some/directory -xdev -printf . e df , ou seja, vários links físicos para o mesmo arquivo serão contados apenas uma vez).

    
por 07.04.2014 / 22:05
2

UPDATE

Este é o método mais rápido que posso imaginar que isso possa ser feito de forma totalmente portável. Eu uso tar abaixo porque ele adicionará automaticamente arquivos vinculados apenas uma vez:

   find /./ -xdev ! -type d | tar -cf - - | tar -t | sed -n '\|^/\./|c.' | wc -l

portátil e muito rápido:

find / -xdev | sed -n '/^[./]/c\.' | wc -l

Eu não acredito que você precise de todo o resto - embora @Graeme estivesse certo sobre as possíveis falhas abaixo. Isso, no entanto, não tem as mesmas deficiências:

find /./ -xdev | sed -n '\|^/\./|c.' | wc -l

Tudo o que você precisa fazer é garantir um caminho completo para o root e não é necessário passar por todos os outros obstáculos.

NOTA: Como Gilles aponta, usar -tipo f é um erro notório. Eu atualizei este post para refletir isso.

Além disso, para uma contagem mais precisa, você só precisa fazer isso:

du / --inodes -xs

Desde que suas ferramentas estejam atualizadas, isso fornecerá o número exato de arquivos em seu sistema de arquivos raiz. Isso pode ser usado para qualquer diretório também.

Aqui está um meio de obter uma contagem exata de todos os arquivos em qualquer sistema de arquivos ou subdiretório, excluindo hardlinks com apenas ferramentas muito comumente disponíveis. Primeiro, isole a raiz de destino com um mount --bind ausente:

mkdir /tmp/ls ; sudo mount -B / $_ ; cd $_

Em seguida, conte seus arquivos:

sudo ls -ARUi1 ./ | 
grep -o '^ *[0-9]*' | 
sort -un | 
wc -l

Eu fiz algo muito semelhante a isso para outra resposta há alguns dias - apesar de que foi um pouco mais complicado porque o objetivo era classificar por subdiretórios contendo as maiores contagens de arquivos - então o comando parece um pouco diferente do que o aqui. Mas isso ainda é muito rápido, a propósito.

De qualquer forma, o coração disso é o comando ls . Ele -Recursively pesquisa a árvore inteira, listando -Almost-all -inodes -Unsorted em -1 arquivo por linha. Então, grep -only o inode [0-9]numbers, sort on -unique -numbers e wcount -lines.

    
por 07.04.2014 / 16:35
0

Do seu diretório raiz:

find . -type f | wc -l

Você pode alterar o caminho (aqui.) para qualquer diretório no qual deseja contar os arquivos. Se você não quiser ir em subdiretórios, adicione a opção -maxdepth 1

    
por 07.04.2014 / 15:06

Tags