Questão Recursivamente conte todos os arquivos em um diretório [duplicado]


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

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 de retornar 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 rodar ls | wc ou similar?


165


origem


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


Respostas:


find . -type f | wc -l

Explicação:
find . -type f encontra todos os arquivos ( tipo f ) nisso ( . ) e em todos os subdiretórios, os nomes dos arquivos são impressos em um padrão por linha.

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

Juntos, eles contam todos os seus arquivos.


289





As respostas acima já respondem a pergunta, mas vou acrescentar 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 busca é muito mais rápida, quase instantânea, ou pelo menos para mim. Isso ocorre porque a cláusula type tem que executar uma chamada do sistema stat () em cada nome para verificar seu tipo - omitir isso evita fazê-lo.

Isso tem a diferença de retornar a contagem de arquivos e pastas em vez de apenas arquivos, mas pelo menos para mim é suficiente, já que eu geralmente uso isso para descobrir quais pastas têm enormes quantidades de arquivos que demoram 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.


42





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.


24





Com 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


8





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

7



Em um Mac / BSD: find $DIR -exec stat -f '%HT' {} \; | sort | uniq -c | sort -rn (Aqui, digite %T está vazio para um arquivo normal, um asterisco para um arquivo executável ou uma barra para uma pasta; conseqüentemente %HT é necessário, ou algum texto extra para evitar que o espaço não seja contado, como > %T.) - Arjan