Prompt de comando do Windows: como obter a contagem de todos os arquivos no diretório atual?


24

Em que comando você usaria cmd.exepara encontrar o número de arquivos no diretório atual?

Existe uma opção de PowerShell aqui?

Atualização : esperava evitar dir, pois sei que há mais de 10.000 arquivos no diretório atual. Queria evitar a saída da enumeração para a janela cmd. Obrigado!

Respostas:


27

Se você quiser fazer isso cmd, a seguir é a maneira trivial de fazer isso:

set count=0 & for %x in (*) do @(set /a count+=1 >nul)
echo %count%

Isso está assumindo a linha de comando. Em um arquivo em lotes, você faria

@echo off
setlocal enableextensions
set count=0
for %%x in (*) do set /a count+=1
echo %count%
endlocal

o que faz as coisas um pouco melhor. Você pode soltar o >nulem um lote, pois set /anão exibirá o resultado se for executado a partir de um arquivo em lotes - é exibido diretamente na linha de comando. Além disso, o %sinal no forloop deve ser duplicado.

Eu já vi alguns casos em que as pessoas tentam truques bacanas find /c. Tenha muito cuidado com eles, pois várias coisas podem quebrar isso.

Erros comuns:

  1. Usando find /c /ve tente encontrar algo que nunca seja incluído em um nome de arquivo, como ::. Não vai. Trabalhos. Confiavelmente. Quando a janela do console está configurada para fontes rasterizadas, você pode obter essa combinação de caracteres. I pode incluir caracteres em um nome de arquivo, como :, ?, etc., em suas variantes de largura total, por exemplo, que, em seguida, são convertidos para seus equivalentes ASCII normais que vai quebrar isso. Se você precisar de uma contagem precisa, não tente isso.

  2. Usando find /ce tente encontrar algo que esteja sempre incluído em um nome de arquivo. Obviamente, o ponto ( .) é uma má escolha. Outra resposta sugere

    dir /a-d | find /c ":"

    que assume várias coisas sobre a localidade do usuário, nem todas são verdadeiras (deixei um comentário detalhando os problemas lá) e retorna um resultado em excesso.

Geralmente, você quer usar findem dir /bque corta todo o material não-nome do arquivo e evita fencepost erros dessa forma.

Portanto, a variante elegante seria:

dir /b /a-d | find /c /v ""

que produzirá primeiro todos os nomes de arquivos, uma linha cada. E depois conte todas as linhas dessa saída que não estão vazias. Como o nome do arquivo não pode estar vazio (a menos que esteja faltando alguma coisa, mas o Unicode não fará isso de acordo com meus testes).


1
+1 Era exatamente o que eu estava procurando. Obrigado JR!
p.campbell

Pequeno puxão para fazer a 1ª versão toda uma linha: (contagem set = 0 & para% x no (*) fazer @ (set / a contagem + = 1> nul)) && echo% count%
Jason Massey

+1 paradir /b /a-d | find /c /v ""
Arvo Bowen 08/09

Esta solução não funciona bem quando existem milhões de arquivos. Corre-se "para sempre" - uma solução melhor é afixado abaixo que é executado "em segundos" usando PS e [System.IO.Directory] :: GetFiles ($ path) .Count
ripvlan

@jason, isso provavelmente falharia, pois %count%é expandido no momento da análise.
Joey

17

Peça e você receberá: http://technet.microsoft.com/en-us/library/ee692796.aspx

Contando o número de itens em uma pasta

Bem, o que você sabe: parece que o sol finalmente está saindo, o que significa que está quase na hora de partirmos. Antes de fazer isso, no entanto, vamos mostrar um último pequeno truque com o cmdlet Get-ChildItem. Às vezes, você realmente não precisa saber muito sobre os arquivos em uma pasta; tudo o que você realmente precisa saber é quantos arquivos (se houver) podem ser encontrados em uma pasta específica. Veja como você pode contar rapidamente o número de arquivos em uma pasta:

(Get-ChildItem C:\Scripts).Count

o que você está fazendo aqui? Estamos simplesmente usando Get-ChildItem para retornar uma coleção de todos os itens encontrados na pasta C: \ Scripts; Como essa é uma coleção, tudo o que precisamos fazer é retornar o valor da propriedade Count, que indica o número de itens na coleção. Observe o uso de parênteses: colocamos o comando Get-ChildItem entre parênteses para garantir que o Windows PowerShell pegue primeiro a coleção e só depois ecoe o valor da propriedade Count para essa coleção.

E claro, você pode incluir um filtro ao chamar Get-ChildItem. Precisa saber quantos arquivos .PS1 estão na pasta C: \ Scripts? Pode deixar:

(Get-ChildItem C:\Scripts -filter "*.ps1").Count

FYI .. Pesquisei "arquivos de contagem de PowerShell".


1
Você precisa adicionar um filespec para fazer a contagem realmente contar arquivos, de acordo com o segundo exemplo
Jim B

3
Apenas para ficar claro (Get-ChildItem C: \ Scripts) .Count NÃO retornará o número de arquivos em uma pasta, retornará o número de OBJETOS em uma pasta. Você deve adicionar um filtro ou especificação de arquivo para que ele conte os arquivos. tente .count (GCI) e dir a partir da raiz de sua unidade C: e olhar para a diferença em números
Jim B

4
Nesse mesmo link, se você quiser contar arquivos nas subpastas, use também:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto

1
Não funciona se houver exatamente um arquivo, faça algo assim: $ filecount = @ (get-childitem $ directory -filter " . "). Pelo que li em outro lugar, não é uma matriz se houver um arquivo.
NealWalters

@NealWalters: isso estava correto até o PowerShell v3. Desde então, isso não importa.
Joey

8
dir /a-d | find "File(s)"

Uma palavra de aviso sobre o uso do PowerShell para operações simples de arquivos como esta - é incrivelmente lento em comparação com o cmd.exe, especialmente em conexões de rede ou quando existem milhares de arquivos no diretório. Consulte esta postagem no fórum para obter mais informações.


Se o seu sistema estiver em um idioma diferente do inglês, você terá problemas com isso.
WalyKu

7

dir fornece a contagem total de arquivos na parte inferior.


1
1 Up companheiro, você bater-me a este :)
dyasny

2
e para evitar o custo de assistir todas as linhas rolarem pela janela do cmd ... minimizá-lo, funcionará MUITO mais rápido.
Gbjbaanb

1
ou apenas dir > file.. ahh, eu sinto falta do POSIX
lorenzog 08/02

1
@lorenz: Algum motivo para dir > filenão funcionar no Windows? O redirecionamento de saída não é exatamente mágico, você sabe.
Joey

1
@ johannes: funciona, de fato! Sinto falta do POSIX porque você poderia "apenas" fazer dir | grep (something)para evitar a lenta gravação na tela que atrasa as coisas (e minimiza-as completamente).
Lorenzog

7

O método mais rápido que encontrei é executar o seguinte no console PS.

[System.IO.Directory]::GetFiles($path).Count

onde $ path é um caminho local ou compartilhamento UNC.


2
Olhe para isso. Uma resposta incrível e válida apareceu quase 7,5 anos depois que a pergunta foi feita!
P.campbell

Trabalhei em um servidor virtual em um diretório com mais de 2,1 milhões de arquivos para retornar a contagem em cerca de 10 segundos para mim. Essa deve ser a resposta correta, com certeza.
DarrenMB

Esta é realmente a melhor resposta. Eu tinha uma pasta com 4,5 milhões de arquivos e esse método os contou em alguns segundos. Os métodos em outras respostas propostas foram executados por vários minutos antes de eu desistir deles.
ripvlan

3

conte apenas as linhas da saída dir / B (diretórios incluídos):
dir /B | find /c /v "~~~"

para apenas contar arquivos (sem dirs):
dir /A-D /B | find /c /v "~~~"


Isso retorna a contagem total de arquivos e diretórios
TheCleaner 3/12/12

2

Encontrei isso na net:

dir /a-d | find /c ":" > NUMfiles.###
set /p count=<NUMfiles.###
echo %count%

Eu testei e parece funcionar.


"Parece que" é a palavra correta aqui. (1) Isso é desativado por um em qualquer caso, pois o dircomando inclui uma linha com dois pontos que não é um arquivo. (2) Isso depende do formato da hora para incluir dois pontos, o que não necessariamente precisa ser assim. (3) Ele se baseia no formato numérico que não inclui dois pontos, o que também não precisa necessariamente ser assim. Além disso, passar por um arquivo aqui é desnecessário e não funcionará se você não tiver acesso de gravação - má ideia.
Joey

Como fazer isso sem criar o arquivo "NUMfiles. ###"?
NickUnuchek

2

Apenas uma ressalva para aqueles que podem usar a resposta do Trevoke no PowerShell acima ( prompt de comando do Windows: como obter a contagem de todos os arquivos no diretório atual? ): Por design, ecoar a propriedade Count de uma coleção retornada por Get-ChildItem pode fornecer resultados enganosos se o valor for 1 ou 0. Isso ocorre porque a propriedade Count está disponível apenas em matrizes. Se menos de 2 itens forem retornados por Get-ChildItem, o resultado será escalar e .Count retornará nada. Para contornar isso, expresse-o explicitamente em uma matriz, por exemplo, @ (Get-ChildItem C: \ Scripts) .Count.

Para obter mais informações, consulte http://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-file ou http://www.vistax64.com/powershell/266379 -get-childitem-count-not-working-one-file.html .


0

dir retorna o número de arquivos e diretórios na parte inferior


0

É claro que o trabalho funcionará

Sem instalar algo no servidor, mas com o PowerShell em sua estação de trabalho, você pode:

(gwmi -computer theserver -query "select *from cim_datafile where path = '\\'").count

esse comando fornecerá todos os arquivos (sistema e oculto incluídos) e, como mencionado anteriormente, se o PowerShell estiver na máquina, você pode simplesmente

(GCI c:\*.*).count

Observe que se você não incluir o . você receberá uma contagem de todos os arquivos e diretórios. Você não incluirá arquivos ocultos e do sistema que você precisa adicionar -force para contar todos eles


0

Se eu precisasse disso apenas uma vez, usaria o dir, caso contrário, consideraria usar o dir, provavelmente como um aplicativo C # porque é com isso que eu estaria mais familiarizado (embora o VBScript ou o PowerShell também sejam viáveis).

(A propósito - não é o DOS se você estiver usando o cmd.exe)


0

Eu acredito que você pode usar o attrib para obter a contagem de arquivos:

attrib.exe /s /D *.*|find /c /v "" >> filecount.txt

Isso criará um arquivo chamado filecount.txt no diretório atual com o número de arquivos e pastas no diretório atual (incluindo o arquivo recém-criado). Você pode mudar o

*.*

para

<full_path>\*.*

para obter a contagem de arquivos de um diretório específico. Remova a opção "/ D" se você não quiser contar pastas. A opção "/ s" processa arquivos em todos os diretórios no caminho especificado. Portanto, remova-o se você deseja apenas arquivos no caminho especificado e não deseja incluir arquivos nas subpastas.

Por exemplo, se você deseja descobrir quantos arquivos há na sua unidade C: \ e não em nenhuma subpasta, use o comando:

attrib.exe C:\*.* | find /c /v "" >> filecount.txt

Usar arquivos para obter resultados não é a idéia mais inteligente. O que você faz se o diretório atual não for gravável por você?
Joey

@Johannes Use um diretório ao qual você tem acesso de gravação? por exemplo, canalize a saída para C: \ MyWritableDir \ filecount.txt
smoak

Ainda desnecessário.
Joey

-2

Estou fazendo algo semelhante e isso funciona com qualquer número de arquivos instantaneamente.

Setlocal enabledelayedexpansion

Dir /A | find "File(s)" >tmp

For /F "tokens=1" %%i in (tmp) do set n=%%i

Del tmp

If !n! GEQ 10 echo Too many files in directory.

Por que postar uma resposta inútil (e defeituosa) para uma pergunta de 6 anos de idade com muitas (boas) respostas?
Massimo

@ Massimo porque não estava satisfeito com as respostas acima e queria uma solução mais elegante. Por que atrapalhar a busca do conhecimento que não é limitado pelo tempo?
Aaron Lowe

Urgh! As respostas parecem horríveis. Solução editada em resposta. Não há necessidade de me agradecer Eu amo representante negativo para ajudar os outros :-P
Aaron Lowe

Realmente não há razão para usar um arquivo temporário para armazenar alguma saída; Além disso, usar findnão é uma boa ideia. Veja a resposta aceita para obter detalhes.
Massimo

@ Massimo, respondi sua pergunta. Você me deve uma resposta para a minha. Se você puder me mostrar como evitar o uso do arquivo temporário, eu apreciaria isso. Eu já li todas as respostas e foi por isso que publiquei as minhas. Você está assumindo que, porque uma resposta é aceita, novas respostas não podem ser encontradas. Não é apenas para o OP, mas para todos que procuram a mesma solução.
Aaron Lowe
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.