web-development-kb-pt.site

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

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

219
Blake

Usando uma definição ampla de "arquivo"

ls | wc -l

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

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

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

Ou recursivamente:

find .//. ! -name . -print | grep -c //
279
James Roth

Para definição restrita de arquivo:

 find . -maxdepth 1 -type f | wc -l
35
Maciej Piechotka
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> | wc - <letter-l>

15
nicomen

Eu encontrei du --inodes útil, mas não tenho certeza de qual versão de du ela requer. Deve ser substancialmente mais rápido que abordagens alternativas usando find e wc.

No Ubuntu 17.10, o seguinte funciona:

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

Combina com | sort -nr para classificar decrescente pelo número de inodes contendo.

12
krlmlr

Provavelmente, a resposta mais completa usando o par ls/wc é

ls -Aq | wc -l

se você quiser contar arquivos de ponto e

ls -q | wc -l

de outra forma.

  • -A é contar arquivos de ponto, mas omita . e ...
  • -q make ls substitui caracteres não gráficos, especificamente caracteres de nova linha, por ?, criando saída 1 linha para cada arquivo

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

(comportamento de ls testado com coreutils 8.23)

12
Frax

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 infeliz de substituir 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 abreviado para $(ls | wc -l). Analisar a saída de ls sempre me deixa desconfortável, mas aqui deve funcionar desde que os nomes dos seus arquivos não contenham novas linhas ou seu ls os escape. E $(ls -d -- * 2>/dev/null | wc -l) tem a vantagem de manipular graciosamente o caso de uma glob que não corresponde (por exemplo, ele retorna 0 nesse caso, enquanto o método set * Exige testes minuciosos se a glob estiver 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 um glob para ls pode falhar com um erro lista de argumentos muito longa se houver muitos arquivos correspondentes.

8

Ao usar o par ls/wc, se estivermos adicionando -U, será muito mais rápido (não classifique).

ls -AqU | wc -l
5
Jbnair

Após instalar o comando tree, basta digitar:

tree

Se você quiser arquivos ocultos também:

tree -a

Se você estiver usando o 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 da árvore de diretórios você desejar.

4
lev
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. imprime um ponto para cada arquivo em vez do nome do arquivo, e agora é capaz de lidar com qualquer nome de arquivo e também salva dados; nós apenas temos que contar os pontos :)
  • | wc -c conta caracteres
3
aude

Sem tubulação, sem cópia de seqüência, sem garfo, apenas um forro simples

$ fcount() { local f i=0; for f in *; do let i++; done; echo $i; }; fcount
1
DaboD

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

find -maxdepth 1 -type f -print0 | tr -cd '\0' | wc -c

Isso nos salva da provação da análise da saída ls.


Relacionado:

1
codeforester

Aqui está outra técnica na linha do m Gilles publicado :

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

que cria uma matriz com 13.923 elementos (se é quantos arquivos existem).

1
find . -type f -maxdepth 1 |  wc -l 

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

1
srpatch

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 amados como tail e cut. Além disso, observe que a árvore não está disponível por padrão. O comando acima captura primeiro informações sobre o diretório no nível 1 e, em seguida, obtém a última linha tail -n 1 onde está nosso objetivo e termine com cut para obter 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, que tal perguntar o número de diretórios?

0
jonaprieto

Tente isso, espero que esta resposta o ajude

echo $((`ls -l | wc -l` -1 ))
0
Tiger

Você pode verificar com:

ls -l | grep -v ^l | wc -l
0
AMIC MING