Como posso obter uma contagem de arquivos em um diretório usando a linha de comando?

174

Eu tenho um diretório com um grande número de arquivos. Não vejo um interruptor ls para fornecer a contagem. Existe alguma mágica de linha de comando para obter uma contagem de arquivos?

    
por Blake 23.08.2010 / 23:49

17 respostas

210

Usando uma definição ampla de "arquivo"

ls | wc -l

(note que ele não conta arquivos ocultos e assume que os nomes dos arquivos não contêm caracteres de nova linha).

Para incluir arquivos ocultos (exceto . e .. ) e evitar problemas com caracteres de nova linha, a maneira canônica é:

find . ! -name . -prune -print | grep -c /

Ou recursivamente:

find .//. ! -name . -print | grep -c //
    
por 23.08.2010 / 23:56
30

Para definição restrita de arquivo:

 find . -maxdepth 1 -type f | wc -l
    
por 24.08.2010 / 01:01
12
ls -1 | wc -l

...

$ ls --help | grep -- '  -1'
    -1                         list one file per line

...

$ wc --help | grep -- '  -l'
    -l, --lines            print the newline counts

PS: nota ls - < número um > | wc - < carta-l >

    
por 24.08.2010 / 02:57
10

Provavelmente, a resposta mais completa usando ls / wc pair é

ls -Aq | wc -l

se você quiser contar arquivos de ponto e

ls -q | wc -l

caso contrário.

  • -A é para contar arquivos de pontos, mas omite . e .. .
  • -q make ls substitui caracteres não gráficos, especificamente caractere de nova linha, com ? , tornando a saída 1 linha para cada arquivo

Para obter uma saída de linha de ls no terminal (ou seja, sem canalizá-la para wc ), a opção -1 precisa ser adicionada.

(comportamento de ls testado com coreutils 8.23)

    
por 12.03.2015 / 22:35
7

Se você souber que o diretório atual contém pelo menos um arquivo não oculto:

set -- *; echo "$#"

Isso é obviamente generalizável para qualquer glob.

Em um script, isso tem o efeito colateral, às vezes desafortunado, de sobrescrever os parâmetros posicionais. Você pode contornar isso usando um subshell ou com uma função (versão Bourne / POSIX) como:

count_words () {
  eval 'shift; '"$1"'=$#'
}
count_words number_of_files *
echo "There are $number_of_files non-dot files in the current directory"

Uma solução alternativa é $(ls -d -- * | wc -l) . Se o glob for * , o comando poderá ser reduzido para $(ls | wc -l) . Analisar a saída de ls sempre me deixa desconfortável, mas aqui deve funcionar, desde que seus nomes de arquivo não contenham novas linhas, ou seu ls os escapa. E $(ls -d -- * 2>/dev/null | wc -l) tem a vantagem de lidar com o caso de uma globalização não correspondente graciosamente (isto é, retorna 0 nesse caso, enquanto o método set * requer testes complexos se a glob puder estar vazia).

Se os nomes dos arquivos puderem conter caracteres de nova linha, uma alternativa é usar $(ls -d ./* | grep -c /) .

Qualquer uma dessas soluções que dependem de passar a expansão de uma glob para ls pode falhar com um erro lista de argumentos muito longa se houver muitos arquivos correspondentes.

    
por 24.08.2010 / 01:26
5

Enquanto estiver usando o par ls / wc, se estivermos adicionando -U, será muito mais rápido (não classificar).

ls -AqU | wc -l
    
por 22.10.2015 / 10:03
4

Depois de instalar o comando tree, basta digitar:

tree

Se você quiser também arquivos ocultos:

tree -a

Se você estiver usando Debian / Mint / Ubuntu Linux, digite o seguinte comando para instalar o comando tree:

sudo apt-get install tree

A opção -L é usada para especificar o nível máximo de exibição da árvore de diretórios. O comando tree não conta apenas o número de arquivos, mas também o número de diretórios, considerando quantos níveis de árvore de diretório você desejar.

    
por 19.12.2014 / 11:05
3

Eu achei du --inodes útil, mas não tenho certeza de qual versão de du é necessária. No Ubuntu 17.10, os seguintes trabalhos:

du --inodes      # all files and subdirectories
du --inodes -s   # summary
du --inodes -d 2 # depth 2 at most

Combine com | sort -nr para ordenar a descida pelo número de inodes contendo.

    
por 17.06.2018 / 18:55
2
find -maxdepth 1 -type f -printf . | wc -c
  • -maxdepth 1 tornará não-recursivo, find é recursivo por padrão
  • -type f incluirá apenas arquivos
  • -printf . é um toque fofo. ele imprime um ponto para cada arquivo em vez do nome do arquivo, e agora isso é capaz de manipular qualquer nome de arquivo e também salva dados; nós apenas temos que contar os pontos:)
  • | wc -c conta caracteres
por 30.09.2016 / 15:07
1

Sem cano, sem cópia de seqüência de caracteres, sem bifurcação, apenas plain um bash

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
    
por 18.01.2015 / 16:28
1

Aqui está outra técnica nos moldes do um Gilles postou :

word_count () { local c=("$@"); echo "${#c[@]}"; }
file_count=$(word_count *)

que cria um array com 13.923 elementos (se é que existem muitos arquivos).

    
por 24.08.2010 / 03:16
1
find . -type f -maxdepth 1 |  wc -l 

Isso pode listar apenas os arquivos no diretório atual.

    
por 16.06.2016 / 22:13
0

Tente isso, espero que esta resposta o ajude

echo $(('ls -l | wc -l' -1 ))
    
por 01.03.2016 / 20:13
0

Você pode verificar com:

ls -l | grep -v ^l | wc -l
    
por 26.04.2016 / 00:05
0

Melhorando algumas respostas dadas antes, mas desta vez explicitamente.

$ tree -L 1 | tail -n 1 | cut -d " " -f 3

Vale a pena notar o uso de alguns comandos favoritos, como tail e cut . Além disso, observe que a árvore não está disponível por padrão. O comando acima primeiro captura informações sobre o diretório no nível 1, depois pega a última linha tail -n 1 onde está o nosso objetivo e acaba com cut para pegar a terceira palavra.

Por exemplo, localizando em / :

/ $ tree -L 1
.
├── 1
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── lib64 -> usr/lib64
├── lost+found
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var

20 directories, 1 file
/ $ tree -L 1 | tail -n 1
20 directories, 1 file
/ $ tree -L 1 | tail -n 1 | cut -d " " -f 3
1

Então, perguntando o número de diretórios?

    
por 02.02.2017 / 22:20
0

No Linux, para tornar o comando muito robusto e lidar com arquivos que possam ter novas linhas em seus nomes, use:

find -maxdepth 1 -type f -print0 | tr -cd '
find -maxdepth 1 -type f -print0 | tr -cd '%pre%' | wc -c
' | wc -c

Isso nos poupa da provação de analisar ls output.

Relacionados:

por 12.11.2018 / 22:41
-2

Use o comando tree , apenas:

tree
    
por 13.05.2015 / 11:22