Conte recursivamente todos os arquivos em um diretório [duplicado]

199

Possível duplicado:
como posso contar o número de pastas em uma unidade usando o Linux?

Eu tenho uma árvore de diretórios realmente profunda na minha caixa do Linux. Gostaria de contar todos os arquivos nesse caminho, incluindo todos os subdiretórios.

Por exemplo, dada esta árvore de diretórios:

/home/blue
/home/red
/home/dir/green
/home/dir/yellow
/home/otherDir/

Se eu entrar /home, gostaria que ele retornasse quatro arquivos. Ou, pontos de bônus se retornar quatro arquivos e dois diretórios. Basicamente, quero o equivalente a clicar com o botão direito do mouse em uma pasta no Windows e selecionar propriedades e ver quantos arquivos / pastas estão contidos nessa pasta.

Como posso fazer isso mais facilmente? Eu tenho uma solução envolvendo um script Python que escrevi, mas por que isso não é tão fácil quanto executar ls | wcou semelhante?

omghai2u
fonte
Não é exatamente o que você está procurando, mas para obter um total geral muito rápido, se o seu locatebanco de dados estiver atualizado: locate /some/path | wc -l(ou no meu Mac:) locate -c /some/path. Mas: isso também contará arquivos /this/other/path/with/some/pathe contará as próprias pastas.
Arjan
By the way, este é um problema diferente, mas intimamente relacionados (contando todos os diretórios em uma unidade) e solução: superuser.com/questions/129088/...
Amanda

Respostas:

341

find . -type f | wc -l

Explicação:
find . -type flocaliza todos os arquivos ( -tipo f ) neste diretório ( . ) E em todos os subdiretórios, os nomes dos arquivos são impressos para padronizar um por linha.

Isso é então canalizado | em wc(contagem de palavras), a -lopção diz a wc para contar apenas as linhas de sua entrada.

Juntos, eles contam todos os seus arquivos.

Nifle
fonte
11
Isso não lida com o erro de um por um, devido à última nova linha da findsaída
RobertDeRose
apenas para contar diretórios, use '-type d' em vez de '-type f': D
MevlütÖzdemir 12/03
11
Quando não há arquivos encontrados, o resultado é1
Dylanthepiguy
47

As respostas acima já respondem à pergunta, mas acrescentarei que, se você usar o find sem argumentos (exceto a pasta em que deseja que a pesquisa ocorra), como em:

find . | wc -l

a pesquisa é muito mais rápida, quase instantânea, ou pelo menos para mim. Isso ocorre porque a cláusula type precisa executar uma chamada de sistema stat () em cada nome para verificar seu tipo - omitir isso evita isso.

Isso tem a diferença de retornar a contagem de arquivos mais as pastas em vez de apenas os arquivos, mas pelo menos para mim é suficiente, já que geralmente uso isso para descobrir quais pastas têm grandes quantidades de arquivos que levam uma eternidade para copiá-las e compactá-las. Contar pastas ainda me permite encontrar as pastas com a maioria dos arquivos, preciso de mais velocidade do que precisão.

Francisco Vieira
fonte
11
Quando não há arquivos encontrados, o resultado é1
Dylanthepiguy
25

Para arquivos:

find -type f | wc -l

Para diretórios:

find -mindepth 1 -type d | wc -l

Ambos trabalham no diretório de trabalho atual.

cYrus
fonte
11
Quando não há arquivos encontrados, o resultado é1
Dylanthepiguy
8

With bash 4+

shopt -s globstar
for file in **/*
do
  if [ -d "$file" ];then
    ((d++))
  elif [ -f "$file" ];then
     ((f++))
  fi
done
echo "number of files: $f"
echo "number of dirs: $d"

Não é necessário chamar o find duas vezes, se você deseja procurar por arquivos e diretórios

user31894
fonte
8

Leve atualização para a resposta aceita, se você quiser uma contagem de dirs e

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
Rich Homolka
fonte
11
Em um Mac / BSD : find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn(Aqui, o tipo %Testá vazio para um arquivo normal, um asterisco para um arquivo executável ou uma barra para uma pasta; portanto, %HTé necessário ou algum texto extra para evitar que o espaço não seja contado, como > %T. )
Arjan
Dá-me "encontrar: opção ilegal - e" no meu 10.13.6 mac
K.-Michael Aye