Eu sou capaz de listar todos os diretórios por
find ./ -type d
Tentei listar o conteúdo de cada diretório e contar o número de arquivos em cada diretório usando o seguinte comando
find ./ -type d | xargs ls -l | wc -l
Mas isso somava o número total de linhas retornadas por
find ./ -type d | xargs ls -l
Existe uma maneira de contar o número de arquivos em cada diretório?
./
?Respostas:
Supondo que você tenha o GNU find, deixe-o encontrar os diretórios e deixe o bash fazer o resto:
fonte
find . -maxdepth 1 -type d | sort
; do y =find $x | wc -l
; echo $ x, $ y; feitofind . -type d -print0 | while read -d '' -r dir; do files=("$dir"/*); printf "%5d files in directory %s\n" "${#files[@]}" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find $dir -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done | sort -rn -k1
$dir
deve estar entre aspas em seu primeiro comentário para lidar corretamente com nomes de diretórios com espaços em branco. :find . -maxdepth 1 -type d -print0 | while read -d '' -r dir; do num=$(find "$dir" -ls | wc -l); printf "%5d files in directory %s\n" "$num" "$dir"; done
Isso imprime a contagem de arquivos por diretório para o nível de diretório atual:
fonte
du -a | sed '/.*\.\/.*\/.*/!d' | cut -d/ -f2 | sort | uniq -c
. Adicione| sort -nr
para classificar pela contagem em vez do nome do diretório.find. -type f
para encontrar todos os itens do tipo de arquivocut -d/ -f2
para cortar sua pasta específicasort
para classificar a lista de nomes de pastasuniq -c
para retornar o número de vezes que cada nome de pasta foi contadofonte
find . -type f | cut -d/ -f2,3 | sort | uniq -c
Você pode organizar para localizar todos os arquivos, remover os nomes dos arquivos, deixando uma linha contendo apenas o nome do diretório para cada arquivo e, em seguida, contar o número de vezes que cada diretório aparece:
O único problema nisso é se você tem nomes de arquivos ou diretórios contendo um caractere de nova linha, o que é bastante improvável. Se você realmente precisa se preocupar com novas linhas em nomes de arquivos ou diretórios, sugiro que os encontre e corrija para que não contenham novas linhas (e silenciosamente persuadir a parte culpada do erro de seus caminhos).
Se você estiver interessado na contagem dos arquivos em cada subdiretório do diretório atual, contando todos os arquivos em quaisquer subdiretórios junto com os arquivos no subdiretório imediato, então eu adaptaria o
sed
comando para imprimir apenas o diretório de nível superior:O primeiro padrão captura o início do nome, o ponto, a barra, o nome até a próxima barra e a barra, e substitui a linha apenas pela primeira parte, então:
é substituído por
A segunda substituição captura os arquivos diretamente no diretório atual; eles não têm uma barra no final e são substituídos por
./
. A classificação e a contagem funcionam apenas com o número de nomes.fonte
find
. Alguns podem: se houver um arquivodir1/dir2/dir3/file1
, masdir1/dir2
contiver apenas subdiretórios (sem arquivos simples), você pode inferir sua presença. Mas sedir1/dir4
não houver arquivos, seu nome simplesmente não aparecerá.Esta é uma maneira de fazer isso, mas provavelmente não a mais eficiente.
Fornece uma saída como esta, com o nome do diretório seguido pela contagem de entradas nesse diretório. Observe que a contagem de saída também incluirá entradas de diretório que podem não ser o que você deseja.
fonte
bash
,ls
,wc
) para cada diretório encontradofind
.man bash
,A -- signals the end of options and disables further option processing
. Nesse caso, evitaria que um arquivo com nome incorreto encontrado como parte da localização se tornasse parte do processamento de argumento para bash.A solução de qualquer outra pessoa tem uma desvantagem ou outra.
Explicação:
-type d
: estamos interessados em diretórios.-readable
: Só os queremos se for possível listar os arquivos neles. Observe quefind
ainda emitirá um erro quando tentar pesquisar por mais diretórios neles, mas isso evita chamá-exec
-los.-exec sh -c BLAH sh {} ';'
: para cada diretório, execute este fragmento de script, com$0
definido comosh
e$1
definido como o nome do arquivo.printf "%s " "$1"
: imprime portável e minimamente o nome do diretório, seguido por apenas um espaço, não uma nova linha.ls -1UA
: lista os arquivos, um por linha, na ordem do diretório (para evitar travar o tubo), excluindo apenas os diretórios especiais.
e..
wc -l
: conte as linhasfonte
find -type d -readable -exec sh -c 'ls -1UA "$1" | wc -l | tr -d "\n" ; printf "\t%s\n" "$1" ' sh {} ';' | sort -n
Versão ligeiramente modificada da resposta de Sebastian usando em
find
vez dedu
(para excluir a sobrecarga relacionada ao tamanho do arquivo quedu
precisa ser executada e nunca é usada):-mindepth 2
parâmetro é usado para excluir arquivos no diretório atual. Se você removê-lo, verá várias linhas como as seguintes:(muito parecido
du
com a variante com base em)Se você também precisar contar os arquivos no diretório atual, use esta versão aprimorada:
O resultado será como o seguinte:
fonte
Isso também pode ser feito com um loop sobre ls em vez de encontrar
for f in */; do echo "$f -> $(ls $f | wc -l)"; done
Explicação:
for f in */;
- percorre todos os diretóriosdo echo "$f ->
- imprimir cada nome de diretório$(ls $f | wc -l)
- ligue para este diretório e conte as linhasfonte
for f ./* ; do echo $f $(ls "$f" | wc -l); done
Isso deve retornar o nome do diretório seguido pelo número de arquivos no diretório.
Exemplo de saída:
O
export -f
é necessário porque o-exec
argumento defind
não permite a execução de uma função bash a menos que você invoque o bash explicitamente e precise exportar a função definida no escopo atual para o novo shell explicitamente.fonte
./dir1/dir2/dir3
(contando os arquivos emdir1
e seus subdiretórios todos juntos, em vez de contar os arquivos emdir1/dir2/dir3
separadamente daqueles emdir1/dir2
e ambos separadamente daqueles em/dir1
).Eu combinei resposta de Jackman @glenn e resposta da @ pcarvalho (na lista de comentário, há algo errado com a resposta de pcarvalho porque a função de controle extra de estilo de caracter ' ` '(crase)).
Meu script pode aceitar path como um augument e ordenar a lista de diretórios como
ls -l
, também pode lidar com o problema de "espaço no nome do arquivo" .Minha primeira resposta em stackoverflow, e espero que possa ajudar alguém ^ _ ^
fonte
encontrar . -tipo f -printf '% h \ n' | classificar | uniq -c
dá por exemplo:
fonte
Tentei com alguns dos outros aqui, mas acabei com subpastas incluídas na contagem de arquivos quando eu queria apenas os arquivos. Isso é impresso
./folder/path<tab>nnn
com o número de arquivos, sem incluir subpastas, para cada subpasta na pasta atual.fonte
Uma maneira fácil de localizar arquivos recursivamente de um determinado tipo. Nesse caso, arquivos .jpg para todas as pastas no diretório atual:
find . -name *.jpg -print | wc -l
fonte
Um comando milagroso super rápido, que percorre arquivos recursivamente para contar o número de imagens em um diretório e organizar a saída por extensão de imagem:
Créditos: https://unix.stackexchange.com/a/386135/354980
fonte
Essa pode ser outra maneira de navegar pelas estruturas de diretório e fornecer resultados detalhados.
fonte
Editei o script para excluir todos os
node_modules
diretórios dentro do analisado.Isso pode ser usado para verificar se o número de arquivos do projeto está excedendo o número máximo que o inspetor de arquivos pode manipular.
Para verificar o máximo de arquivos que seu sistema pode assistir:
node_modules
A pasta deve ser adicionada aos caminhos excluídos do IDE / editor em sistemas lentos, e a contagem de outros arquivos idealmente não deve exceder o máximo (que pode ser alterado).fonte
Isso dará a contagem geral.
fonte