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?
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 //
Para definição restrita de arquivo:
find . -maxdepth 1 -type f | wc -l
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>
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.
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 arquivoPara 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)
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.
Ao usar o par ls/wc, se estivermos adicionando -U, será muito mais rápido (não classifique).
ls -AqU | wc -l
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.
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 caracteresSem 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
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:
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).
find . -type f -maxdepth 1 | wc -l
Isso pode listar apenas os arquivos no diretório atual.
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?
Tente isso, espero que esta resposta o ajude
echo $((`ls -l | wc -l` -1 ))
Você pode verificar com:
ls -l | grep -v ^l | wc -l