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

170

Eu tenho uma árvore de diretório realmente profunda na minha caixa Linux. Eu 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 passar /home , gostaria que retornasse quatro arquivos. Ou pontos de bônus se ele 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, selecionar propriedades e ver quantos arquivos / pastas estão contidos nessa pasta.

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

    
por omghai2u 12.10.2010 / 23:41

5 respostas

293

find . -type f | wc -l

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

Isso é canalizado | para wc (contagem de palavras) a opção -l diz ao wc para contar apenas as linhas de sua entrada.

Juntos, eles contam todos os seus arquivos.

    
por 12.10.2010 / 23:44
45

As respostas acima já respondem a pergunta, mas adicionarei que se você usar find sem argumentos (exceto para a pasta onde você quer que a busca aconteça) 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 e pastas em vez de apenas arquivos, mas pelo menos para mim é suficiente, pois eu uso principalmente isso para descobrir quais pastas têm enormes quantidades de arquivos que levam uma eternidade para copiá-los e compactá-los. Contando pastas ainda me permite encontrar as pastas com a maioria dos arquivos, eu preciso de mais velocidade do que a precisão.

    
por 29.03.2011 / 00:00
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.

    
por 12.10.2010 / 23:56
8

Com o 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 há necessidade de ligar para encontrar duas vezes se você quiser procurar por arquivos e diretórios

    
por 13.10.2010 / 03:58
7

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

find $DIR -exec stat -c '%F' {} \; | sort | uniq -c | sort -rn
    
por 13.10.2010 / 16:26