Prompt dei comandi di Windows: come ottenere il conteggio di tutti i file nella directory corrente?


24

In quale comando useresti cmd.exeper trovare il numero di file nella directory corrente?

C'è un'opzione PowerShell qui?

Aggiornamento : speravo di evitare dir, poiché so che ci sono oltre 10.000 file nella directory corrente. Volevo evitare l'enumerazione dell'output nella finestra cmd. Grazie!

Risposte:


27

Se vuoi farlo con cmd, allora il seguente è il modo banale per farlo:

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

Questo presuppone che la riga di comando. In un file batch lo faresti

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

il che rende le cose un po 'più belle. Puoi rilasciarlo >nulin un batch, poiché set /anon visualizzerà il risultato se eseguito da un file batch, ma direttamente dalla riga di comando. Inoltre, il %segno nel forloop deve essere raddoppiato.

Ho visto parecchi casi in cui le persone provano astuti trucchi find /c. Stai molto attento con quelli, poiché varie cose possono rompere questo.

Errori comuni:

  1. Utilizzare find /c /ve provare a trovare qualcosa che non è mai incluso in un nome di file, ad esempio ::. Non lo faranno. Opera. Affidabile. Quando la finestra della console è impostata su caratteri raster, è possibile ottenere quella combinazione di caratteri. Posso includere caratteri in un nome di file come :, ad esempio , ?ecc. Nelle loro varianti a larghezza intera, ad esempio, che verranno quindi convertiti nelle loro normali controparti ASCII, che romperanno questo. Se hai bisogno di un conteggio accurato, non provare questo.

  2. Utilizzare find /ce provare a trovare qualcosa che è sempre incluso in un nome file. Ovviamente il punto ( .) è una cattiva scelta. Un'altra risposta suggerisce

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

    che presuppone diverse cose sulla localizzazione dell'utente, non tutte sono garantite come vere (ho lasciato un commento che descrive in dettaglio i problemi lì) e restituisce un risultato troppo.

In genere, si desidera utilizzare findsu ciò dir /bche elimina tutte le cose senza nome di file ed evita errori di fencepost in quel modo.

Quindi la variante elegante sarebbe:

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

che produrrà prima tutti i nomi dei file, una riga ciascuno. E quindi contare tutte le righe di quell'output che non sono vuote. Dal momento che il nome del file non può essere vuoto (a meno che non mi manchi qualcosa, ma Unicode non lo farà scattare in base ai miei test).


1
+1 Era esattamente quello che stavo cercando. Grazie JR!
Campbell

Piccolo aggiustamento per rendere la prima versione tutta una riga: (set count = 0 e per% x in (*) do @ (set / a count + = 1> nul)) && echo% count%
Jason Massey

+1 perdir /b /a-d | find /c /v ""
Arvo Bowen

Questa soluzione non funziona bene quando ci sono milioni di file. Funziona "per sempre" - di seguito viene pubblicata una soluzione migliore che viene eseguita "in pochi secondi" utilizzando PS e [System.IO.Directory] :: GetFiles ($ path) .Count
ripvlan

@jason, ciò probabilmente fallirebbe poiché %count%viene espanso al momento dell'analisi .
Joey,

17

Chiedi e riceverai: http://technet.microsoft.com/en-us/library/ee692796.aspx

Conteggio del numero di elementi in una cartella

Bene, che ne sai: sembra che il sole stia finalmente uscendo, il che significa che è quasi ora che andiamo. Prima di farlo, tuttavia, ti mostriamo un ultimo piccolo trucco con il cmdlet Get-ChildItem. A volte non hai davvero bisogno di sapere molto sui file in una cartella; tutto quello che devi veramente sapere è quanti file (se presenti) possono essere trovati in una determinata cartella. Ecco come puoi contare rapidamente il numero di file in una cartella:

(Get-ChildItem C:\Scripts).Count

Che ci facciamo qui? Stiamo semplicemente usando Get-ChildItem per restituire una raccolta di tutti gli elementi trovati nella cartella C: \ Scripts; poiché si tratta di una raccolta, tutto ciò che dobbiamo fare è restituire il valore della proprietà Count, che indica il numero di elementi nella raccolta. Nota l'uso delle parentesi: racchiudiamo il comando Get-ChildItem tra parentesi per garantire che Windows PowerShell acquisisca prima la raccolta e solo successivamente riecheggi il valore della proprietà Count per quella raccolta.

E certo, puoi includere un filtro quando chiami Get-ChildItem. Hai bisogno di sapere quanti file .PS1 sono nella cartella C: \ Scripts? Okey-doke:

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

Cordiali saluti .. Ho cercato su Google "file di conteggio PowerShell".


1
È necessario aggiungere un filepec per fare in modo che il conteggio conti effettivamente i file, come nel secondo esempio
Jim B

3
Per essere chiari (Get-ChildItem C: \ Scripts) .Count NON restituirà il numero di file in una cartella restituirà il numero di OBJECTS in una cartella. È necessario aggiungere un filtro o una specifica di file per ottenere il conteggio dei file. prova (gci) .count e dir dalla radice del tuo C: guida e guarda la differenza di numeri
Jim B

4
Dallo stesso link, se si desidera contare anche i file nelle sottocartelle, utilizzare:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto

1
Non funziona se esiste esattamente un file, devi fare qualcosa del genere: $ filecount = @ (get-childitem $ directory -filter " . ") .Count. Da quello che ho letto altrove, non è un array se c'è un file.
NealWalters,

@NealWalters: era corretto fino a PowerShell v3. Da allora non importa.
Joey,

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

Un avvertimento sull'uso di PowerShell per operazioni su file semplici come questa: è incredibilmente lento rispetto a cmd.exe, specialmente tramite connessioni di rete o quando ci sono migliaia di file nella directory. Vedi questo post sul forum per maggiori informazioni.


Se il tuo sistema è in una lingua diversa dall'inglese, avrai problemi con questo.
WalyKu,

7

dir ti dà il conteggio totale dei file in fondo.


1
1 Up
amico

2
e per evitare il costo di guardare tutte le linee scorrere attraverso la finestra cmd ... minimizzalo, funzionerà MOLTO più velocemente.
gbjbaanb,

1
o solo dir > file.. ahh mi manca POSIX
lorenzog

1
@lorenz: qualche motivo per cui dir > filenon dovrebbe funzionare in Windows? Il reindirizzamento dell'output non è esattamente magico, lo sai.
Joey,

1
@johannes: funziona davvero! Mi manca POSIX perché potresti "semplicemente" fare dir | grep (something)per evitare la scrittura su schermo lenta che rallenta le cose (e minimizzandola del tutto).
Lorenzog,

7

Il metodo più veloce che ho trovato è quello di eseguire quanto segue nella console PS.

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

dove $ path è un percorso locale o una condivisione UNC.


2
Guarda quello. Una risposta fantastica e valida è apparsa quasi 7,5 anni dopo che è stata posta la domanda!
p

Ha lavorato su un server virtuale in una directory con oltre 2,1 milioni di file per restituire il conteggio in circa 10 secondi per me. Questa dovrebbe essere la risposta corretta di sicuro.
DarrenMB,

Questa è davvero la risposta migliore. Avevo una cartella con 4,5 milioni di file e questo metodo li ha contati in diversi secondi. I metodi in altre risposte proposte sono durati diversi minuti prima che mi arrendessi.
ripvlan,

3

basta contare le righe dall'output dir / B (directory incluse):
dir /B | find /c /v "~~~"

per contare solo i file (senza dir):
dir /A-D /B | find /c /v "~~~"


Ciò restituisce il totale dei file e delle directory
TheCleaner

2

Trovato questo in rete:

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

Ho provato e sembra funzionare.


"Sembra" è la parola corretta qui. (1) Questo è disattivato da uno in ogni caso, poiché il dircomando include una riga con due punti in esso che non è un file. (2) Questo si basa sul formato dell'ora per includere i due punti, che non deve necessariamente essere così. (3) Si basa sul formato numerico che non include i due punti, che non deve necessariamente essere così. Inoltre, passare attraverso un file qui non è necessario e non funzionerà se non si ha accesso in scrittura, una cattiva idea.
Joey,

Come farlo senza creare il file "NUMfiles. ###"?
NickUnuchek,

2

Solo un avvertimento per coloro che potrebbero usare la risposta di Trevoke PowerShell sopra ( prompt dei comandi di Windows: come ottenere il conteggio di tutti i file nella directory corrente? ): In base alla progettazione, l'eco della proprietà Count di una raccolta restituita da Get-ChildItem può dare risultati fuorvianti se il valore è 1 o 0. Questo perché la proprietà Count è disponibile solo sugli array. Se Get-ChildItem restituisce meno di 2 elementi, il risultato è scalare e .Count non restituisce nulla. Per ovviare a questo, castarlo esplicitamente in un array, ad esempio @ (Get-ChildItem C: \ Scripts) .Count.

Per ulteriori informazioni, vedere http://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-file o http://www.vistax64.com/powershell/266379 -get-childitem-count-not-working-one-file.html .


0

dir restituisce il numero di file e directory in fondo


0

Ovviamente funzionerà

Senza installare qualcosa sul server ma avendo PowerShell sulla workstation è possibile:

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

quel comando ti darà tutti i file (incluso il sistema e quelli nascosti) e, come detto in precedenza, se PowerShell è sulla macchina, puoi semplicemente

(GCI c:\*.*).count

Nota che se non includi il file . otterrai un conteggio di tutti i file e di tutte le directory. Non includerai i file nascosti e di sistema che devi aggiungere -force per contarli tutti


0

Se ne avessi bisogno solo una volta avrei usato dir, altrimenti prenderei in considerazione il mio rotolamento, probabilmente come un'app C # perché è quello con cui avrei più familiarità (anche se VBScript o PowerShell sarebbero fattibili).

(A proposito, non è DOS se si utilizza cmd.exe)


0

Credo che tu possa usare attrib per ottenere il conteggio dei file:

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

Ciò creerà un file chiamato filecount.txt nella directory corrente con il numero di file e cartelle nella directory corrente (incluso il file appena creato). È possibile modificare il

*.*

a

<full_path>\*.*

per ottenere il conteggio dei file di una determinata directory. Rimuovere l'opzione "/ D" se non si desidera contare le cartelle. L'opzione "/ s" elabora i file in tutte le directory nel percorso specificato. Quindi rimuovilo se vuoi solo i file nel percorso specificato e non vuoi includere i file nelle sottocartelle.

Quindi, ad esempio, se vuoi scoprire quanti file ci sono nel tuo disco C: \ e non in nessuna sottocartella, dovresti usare il comando:

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

L'uso dei file per i risultati non è l'idea più intelligente. Cosa fai se la directory corrente non è scrivibile da te?
Joey,

@Johannes Utilizzare una directory a cui si ha accesso in scrittura? ad es. reindirizzare l'output su C: \ MyWritableDir \ filecount.txt
smoak

Ancora inutili.
Joey,

-2

Sto facendo qualcosa di simile e questo funziona istantaneamente con qualsiasi numero di file.

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.

Perché pubblicare una risposta inutile (e imperfetta) a una domanda di 6 anni con molte (buone) risposte?
Massimo

@Massimo perché non ero soddisfatto delle risposte sopra e volevo una soluzione più elegante. Perché ostacolare la ricerca della conoscenza che non è limitata dal tempo?
Aaron Lowe,

Urgh! Le risposte sembrano orribili. Soluzione modificata in risposta. Non c'è bisogno di ringraziarmi. Amo i rappresentanti negativi per aiutare gli altri :-P
Aaron Lowe,

Non c'è davvero alcun motivo per usare un file temporaneo per contenere un output; inoltre, l'utilizzo findnon è una buona idea. Vedi la risposta accettata per i dettagli.
Massimo

@Massimo ho risposto alla tua domanda. Mi devi una risposta alla mia. Se puoi mostrarmi come evitare di utilizzare il file temporaneo, lo apprezzerei. Ho già letto tutte le risposte ed è per questo che ho pubblicato le mie. Lo stai assumendo perché una risposta è accettata e non è possibile trovare nuove risposte. Non è solo per l'OP ma per tutti coloro che cercano la stessa soluzione.
Aaron Lowe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.