Eu tenho um diretório com um grande número de arquivos. Não vejo uma ls
opção para fornecer a contagem. Existe alguma mágica na linha de comando para obter uma contagem de arquivos?
command-line
Blake
fonte
fonte
tree . | tail
outree -a . | tail
incluir arquivos / diretórios ocultos,tree
é recursivo se é isso que você deseja.Respostas:
Usando uma ampla definição de "arquivo"
(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 evitar problemas com caracteres de nova linha, a maneira canônica é:Ou recursivamente:
fonte
wc
é um programa de "contagem de palavras". A-l
opção faz com que conte linhas. Nesse caso, está contando as linhas na saída dels
. Esta é sempre a maneira como me ensinaram a obter uma contagem de arquivos para um determinado diretório também.ls
simls -1
se a saída for um tubo.ls -la
, receberá três linhas no diretório. Você desejals -lA | wc -l
pular as entradas.
e..
. Você ainda estará fora de um, no entanto.ls -q | wc -l
- embora observe que os arquivos ocultos ainda não serão contados por essa abordagem e que os diretórios serão contados.Para definição restrita de arquivo:
fonte
-maxdepth 1
contagem recursiva dos arquivos (ou ajustá-lo para a profundidade máxima de pesquisa desejada).find -maxdepth 1 -type f -printf "\n" | wc -l
...
...
PS: Nota ls - <número> | wc - <letter-l>
fonte
ls
faz-1
automaticamente quando a saída é para um tubo.[[ -p /dev/stdin ]] && echo "stdin is from a pipe"
Provavelmente a resposta mais completa usando
ls
/wc
par ése você deseja contar arquivos de ponto e
de outra forma.
-A
é contar arquivos de ponto, mas omita.
e..
.-q
façals
substituir caracteres não gráficos, especificamente caracteres de nova linha, com?
, produzindo 1 linha para cada arquivoPara obter uma saída de linha única
ls
no terminal (ou seja, sem conectá-lawc
), a-1
opção deve ser adicionada.(comportamento de
ls
testado com coreutils 8.23)fonte
-1
não é necessário. Quanto a "ele lida com novas linhas nos nomes de arquivos de maneira sensata com a saída do console" , isso ocorre por causa da-q
opção (que você deve usar em vez de-b
ser portátil) que "Força" cada instância de caracteres de nome de arquivo não imprimível e caracteres <tab> a serem gravados como o caractere <question-mark> ('?'). As implementações podem fornecer essa opção por padrão se a saída for para um dispositivo terminal. " Assim, por exemplo,ls -Aq | wc -l
para contar todos os arquivos / diretórios ouls -qp | grep -c /
para contar dirs único não-escondidos etc ...-b
para-q
.Se você souber que o diretório atual contém pelo menos um arquivo não oculto:
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:
Uma solução alternativa é
$(ls -d -- * | wc -l)
. Se a glob estiver*
, o comando pode ser abreviado para$(ls | wc -l)
. Analisar a saída dels
sempre me deixa desconfortável, mas aqui deve funcionar, desde que os nomes dos seus arquivos não contenham novas linhas ou que você osls
escape. E$(ls -d -- * 2>/dev/null | wc -l)
tem a vantagem de lidar com o caso de um globo sem correspondência normalmente (ou seja, ele retorna 0 nesse caso, enquanto oset *
método exige testes minuciosos se o globo estiver vazio).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
ls
pode falhar com um erro muito longo da lista de argumentos se houver muitos arquivos correspondentes.fonte
local
ou eliminá-la:eval $1=$#
ou apenas usarecho $#
e fazernumber_of_files=$(count_words *)
.$#
(você não fez isso antes da edição)?$1
. Então, o que eu quero contar é o número de parâmetros que não são o primeiro parâmetro. (Eu não posso usarshift
porque eu preciso para manter o nome da variável ao redor.) (Umm, agora se você tivesse perguntado sobre a primeira linha ...)shift
se eu tempo certo.Eu achei
du --inodes
útil, mas não tenho certeza de qual versãodu
requer. Deve ser substancialmente mais rápido do que abordagens alternativas usandofind
ewc
.No Ubuntu 17.10, o seguinte funciona:
Combine com
| sort -nr
para classificar decrescente pelo número de inodes contendo.fonte
Ao usar o par ls / wc, se estivermos adicionando -U, será muito mais rápido (não classifique).
fonte
-U
é específico do GNU.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.
fonte
-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 caracteresfonte
Sem tubo, sem cópia de seqüência, sem forquilha, apenas um forro simples
fonte
Aqui está outra técnica ao longo da linha que Gilles postou :
que cria uma matriz com 13.923 elementos (se houver quantos arquivos houver).
fonte
c
matriz?word_count() { echo "$#"; }
seria o suficiente. O objetivo da solução @Gilles é armazenar a contagem em uma variável retornada para evitar a necessidade de usar a substituição de comandos (que envolve um garfo e tubo em shells que não sejam ksh93).Isso pode listar apenas os arquivos no diretório atual.
fonte
find . -type f
encontrará arquivos no diretório atual e também, recursivamente, nos subdiretórios.Tente isso, espero que esta resposta o ajude
fonte
Você pode verificar com:
fonte
Melhorando algumas respostas dadas antes, mas desta vez explicitamente.
Vale a pena notar o uso de alguns comandos amados como
tail
ecut
. 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, obtém a última linhatail -n 1
onde está nosso objetivo e termina comcut
a terceira palavra.Por exemplo, localizando em
/
:Então, que tal perguntar o número de diretórios?
fonte
No Linux, para tornar o comando muito robusto e manipular arquivos que possam ter novas linhas em seus nomes, use o seguinte:
Isso nos salva da provação de analisar a
ls
saída.Palavras-chave:
fonte
Use o
tree
comando, apenas:fonte