Invite de commandes Windows: comment obtenir le nombre de tous les fichiers du répertoire actuel?

24

Quelle commande utiliseriez-vous cmd.exepour trouver le nombre de fichiers dans le répertoire actuel?

Y a-t-il une option PowerShell ici?

Mise à jour : j'espérais éviter dir, car je sais qu'il y a plus de 10 000 fichiers dans le répertoire actuel. Je voulais éviter la sortie de l'énumération dans la fenêtre cmd. Merci!

p.campbell
la source

Réponses:

27

Si vous voulez le faire avec cmd, alors voici la façon la plus simple de le faire:

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

Cela suppose la ligne de commande. Dans un fichier batch, vous feriez

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

ce qui fait les choses un peu mieux. Vous pouvez supprimer le >nuldans un lot, car set /an'affichera pas le résultat s'il est exécuté à partir d'un fichier de commandes, il le fait directement à partir de la ligne de commande. De plus, le %signe dans la forboucle doit être doublé.

J'ai vu pas mal d'exemples où les gens essayent des astuces astucieuses avec find /c. Soyez très prudent avec ceux-ci, car diverses choses peuvent casser cela.

Erreurs fréquentes:

  1. Utiliser find /c /vet essayer de trouver quelque chose qui n'est jamais inclus dans un nom de fichier, tel que ::. Habitude. Travail. De manière fiable. Lorsque la fenêtre de la console est définie sur des polices raster, vous pouvez obtenir ces combinaisons de caractères. Je peux inclure des caractères dans un nom de fichier tel que :, ?, etc. , dans leurs variantes pleine largeur par exemple, qui seront ensuite converties à leurs homologues ASCII normaux qui cassera cela. Si vous avez besoin d'un décompte précis, n'essayez pas.

  2. Utiliser find /cet essayer de trouver quelque chose qui est toujours inclus dans un nom de fichier. De toute évidence, le point ( .) est un mauvais choix. Une autre réponse suggère

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

    ce qui suppose plusieurs choses sur les paramètres régionaux de l'utilisateur, qui ne sont pas toutes garanties être vraies (j'ai laissé un commentaire détaillant les problèmes là-bas) et renvoie un résultat de trop.

En général, vous voulez utiliser findsur ce dir /bqui retranche tous les trucs non-nom de fichier et évite fencepost erreurs de cette façon.

La variante élégante serait donc:

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

qui affichera d'abord tous les noms de fichiers, une ligne chacun. Et puis comptez toutes les lignes de cette sortie qui ne sont pas vides. Étant donné que le nom de fichier ne peut pas être vide (sauf s'il me manque quelque chose, mais Unicode ne déclenchera pas cela selon mes tests).

Joey
la source
1
+1 C'est exactement ce que je cherchais. Merci JR!
p.campbell
Petit ajustement pour faire de la 1ère version une seule ligne: (set count = 0 & pour% x in (*) do @ (set / a count + = 1> nul)) && echo% count%
Jason Massey
+1 pourdir /b /a-d | find /c /v ""
Arvo Bowen
Cette solution ne fonctionne pas bien lorsqu'il y a des millions de fichiers. Il s'exécute "pour toujours" - une meilleure solution est publiée ci-dessous qui s'exécute "en quelques secondes" en utilisant PS et [System.IO.Directory] :: GetFiles ($ path) .Count
ripvlan
@jason, cela échouerait probablement car %count%est développé au moment de l'analyse.
Joey
17

Demandez et vous recevrez: http://technet.microsoft.com/en-us/library/ee692796.aspx

Compter le nombre d'éléments dans un dossier

Eh bien, que savez-vous: on dirait que le soleil sort enfin, ce qui signifie qu'il est presque temps pour nous de partir. Avant de le faire, cependant, nous allons vous montrer une dernière petite astuce avec la cmdlet Get-ChildItem. Parfois, vous n'avez pas vraiment besoin d'en savoir beaucoup sur les fichiers d'un dossier; tout ce que vous devez vraiment savoir, c'est combien de fichiers (le cas échéant) peuvent être trouvés dans un dossier particulier. Voici comment vous pouvez rapidement compter le nombre de fichiers dans un dossier:

(Get-ChildItem C:\Scripts).Count

Que faisons-nous ici? Nous utilisons simplement Get-ChildItem pour renvoyer une collection de tous les éléments trouvés dans le dossier C: \ Scripts; car il s'agit d'une collection, tout ce que nous avons à faire est de renvoyer la valeur de la propriété Count, qui nous indique le nombre d'éléments dans la collection. Notez l'utilisation de parenthèses: nous plaçons la commande Get-ChildItem entre parenthèses pour nous assurer que Windows PowerShell récupère d'abord la collection, puis seulement renvoie la valeur de la propriété Count pour cette collection.

Et bien sûr, vous pouvez inclure un filtre lors de l'appel de Get-ChildItem. Besoin de savoir combien de fichiers .PS1 se trouvent dans le dossier C: \ Scripts? Okey-doke:

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

FYI .. J'ai googlé "fichiers de comptage PowerShell".

Trevoke
la source
1
Vous devez ajouter une spécification de fichier pour que le décompte compte réellement les fichiers, comme dans le deuxième exemple
Jim B
3
Juste pour être clair (Get-ChildItem C: \ Scripts) .Count ne retournera PAS le nombre de fichiers dans un dossier, il renverra le nombre d'OBJETS dans un dossier. Vous devez ajouter un filtre ou une spécification de fichier afin de pouvoir compter les fichiers. essayez (gci) .count et dir depuis la racine de votre lecteur C: et regardez la différence en nombre
Jim B
4
À partir de ce même lien, si vous souhaitez également compter les fichiers dans les sous-dossiers:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto
1
Ne fonctionne pas s'il y a exactement un fichier, faites quelque chose comme ceci: $ filecount = @ (get-childitem $ directory -filter " . ") .Count. D'après ce que j'ai lu ailleurs, ce n'est pas un tableau s'il y a un fichier.
NealWalters
@NealWalters: C'était correct jusqu'à PowerShell v3. Depuis, cela n'a plus d'importance.
Joey
8
dir /a-d | find "File(s)"

Un mot d'avertissement sur l'utilisation de PowerShell pour des opérations de fichiers simples comme celle-ci - c'est incroyablement lent par rapport à cmd.exe, en particulier sur les connexions réseau ou lorsqu'il y a des milliers de fichiers dans le répertoire. Voir ce post sur le forum pour plus d'informations.

Rossnz
la source
Si votre système utilise une langue différente de l'anglais, vous aurez des problèmes avec cela.
WalyKu
7

dir vous donne le nombre total de fichiers en bas.

lorenzog
la source
1
1 Up mate, tu m'as battu à celui-ci :)
dyasny
2
et pour éviter le coût de regarder toutes les lignes défiler à travers la fenêtre cmd ... minimisez-le, cela fonctionnera BEAUCOUP plus rapidement.
gbjbaanb
1
ou juste dir > file.. ahh je manque POSIX
lorenzog
1
@lorenz: Une raison pour laquelle dir > filene devrait pas fonctionner sous Windows? La redirection de sortie n'est pas exactement magique, vous savez.
Joey
1
@johannes: ça marche, en fait! POSIX me manque parce que vous pourriez "juste" faire dir | grep (something)pour éviter l'écriture lente à l'écran qui ralentit les choses (et la minimise).
lorenzog
7

La méthode la plus rapide que j'ai trouvée consiste à exécuter ce qui suit dans la console PS.

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

où $ path est un chemin local ou un partage UNC.

John Brooks
la source
2
Regarde ça. Une réponse impressionnante valide est apparue près de 7,5 ans après la question!
p.campbell
A travaillé sur un serveur virtuel dans un répertoire avec plus de 2,1 millions de fichiers pour retourner le décompte en environ 10 secondes pour moi. Cela devrait être la bonne réponse à coup sûr.
DarrenMB
C'est vraiment la meilleure réponse. J'avais un dossier contenant 4,5 millions de fichiers et cette méthode les comptait en quelques secondes. Les méthodes des autres réponses proposées ont fonctionné pendant plusieurs minutes avant que je ne les abandonne.
ripvlan
3

comptez simplement les lignes de la sortie dir / B (répertoires inclus):
dir /B | find /c /v "~~~"

pour juste compter les fichiers (sans dir):
dir /A-D /B | find /c /v "~~~"

Garcia
la source
Cela renvoie le nombre total de fichiers et de répertoires
TheCleaner
2

Trouvé cela sur le net:

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

J'ai testé et ça semble marcher.

Kelsey
la source
«Semble» est le mot correct ici. (1) Ceci est désactivé par un dans tous les cas, car la dircommande inclut une ligne avec deux points qui n'est pas un fichier. (2) Cela repose sur le format d'heure pour inclure les deux points, ce qui ne doit pas nécessairement l'être. (3) Il s'appuie sur le format numérique sans les deux points, ce qui ne doit pas nécessairement l'être. De plus, parcourir un fichier ici n'est pas nécessaire et ne fonctionnera pas si vous n'avez pas accès en écriture - mauvaise idée.
Joey
Comment le faire sans créer de fichier "NUMfiles. ###"?
NickUnuchek
2

Juste une mise en garde pour ceux qui pourraient utiliser la réponse PowerShell de Trevoke ci-dessus ( invite de commande Windows: comment obtenir le nombre de tous les fichiers dans le répertoire actuel? ): Par conception, faire écho à la propriété Count d'une collection retournée par Get-ChildItem peut donner des résultats trompeurs si la valeur est 1 ou 0. En effet, la propriété Count n'est disponible que sur les tableaux. Si moins de 2 éléments sont retournés par Get-ChildItem, le résultat est scalaire et .Count ne renvoie rien. Pour contourner ce problème, convertissez-le explicitement dans un tableau, par exemple, @ (Get-ChildItem C: \ Scripts) .Count.

Pour plus d'informations, voir 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 .

Heather M.
la source
0

dir renvoie le nombre de fichiers et de répertoires en bas

Dyasny
la source
0

DIr fonctionnera bien sûr

Sans installer quelque chose sur le serveur mais avec PowerShell sur votre poste de travail, vous pouvez faire:

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

cette commande vous donnera tous les fichiers (système et caché inclus) et comme mentionné précédemment si PowerShell est sur la machine, vous pouvez simplement

(GCI c:\*.*).count

Notez que si vous n'incluez pas le . vous obtiendrez un décompte de tous les fichiers et de tous les répertoires. Vous n'incluerez pas les fichiers cachés et système que vous devez ajouter -force pour les compter tous

Jim B
la source
0

Si je n'avais besoin de cela qu'une fois, j'utiliserais simplement dir, sinon j'envisagerais de lancer la mienne, probablement comme une application C # car c'est ce que je connais le mieux (bien que VBScript ou PowerShell soit également viable).

(Au fait - ce n'est pas DOS si vous utilisez cmd.exe)

Maximus Minimus
la source
0

Je pense que vous pouvez utiliser attrib pour obtenir le nombre de fichiers:

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

Cela créera un fichier appelé filecount.txt dans le répertoire actuel avec le nombre de fichiers et de dossiers dans le répertoire actuel (y compris le fichier nouvellement créé). Vous pouvez changer le

*.*

à

<full_path>\*.*

afin d'obtenir le nombre de fichiers d'un répertoire particulier. Supprimez l'option "/ D" si vous ne voulez pas compter les dossiers. L'option "/ s" traite les fichiers dans tous les répertoires du chemin spécifié. Supprimez-le donc si vous voulez uniquement des fichiers dans le chemin spécifié et que vous ne voulez pas inclure de fichiers dans des sous-dossiers.

Ainsi, par exemple, si vous souhaitez savoir combien de fichiers se trouvent dans votre lecteur C: \ et non dans un sous-dossier, vous utiliserez la commande:

attrib.exe C:\*.* | find /c /v "" >> filecount.txt
smoak
la source
L'utilisation de fichiers pour les résultats n'est pas l'idée la plus intelligente. Que faites-vous si le répertoire actuel n'est pas accessible en écriture par vous?
Joey
@Johannes Utilisez un répertoire auquel vous avez accès en écriture? par exemple, diriger la sortie vers C: \ MyWritableDir \ filecount.txt
smoak
Toujours inutile.
Joey
-2

Je fais quelque chose de similaire et cela fonctionne instantanément avec n'importe quel nombre de fichiers.

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.
Aaron Lowe
la source
Pourquoi poster une réponse inutile (et imparfaite) à une question de 6 ans avec déjà beaucoup de (bonnes) réponses?
Massimo
@Massimo car je n'étais pas satisfait des réponses ci-dessus et je voulais une solution plus élégante. Pourquoi s'opposer à la recherche de connaissances qui ne sont pas limitées dans le temps?
Aaron Lowe
Urgh! Les réponses semblent horribles. Solution modifiée en réponse. Pas besoin de me remercier J'adore les représentants négatifs pour avoir aidé les autres :-P
Aaron Lowe
Il n'y a vraiment aucune raison d'utiliser un fichier temporaire pour contenir une sortie; aussi, l'utilisation findn'est pas une bonne idée. Voir la réponse acceptée pour plus de détails.
Massimo
@Massimo J'ai répondu à votre question. Vous me devez une réponse à la mienne. Si vous pouvez me montrer comment éviter d'utiliser le fichier temporaire, j'apprécierais cela. J'ai déjà lu toutes les réponses, c'est pourquoi j'ai publié la mienne. Vous supposez que parce qu'une réponse est acceptée, de nouvelles réponses sont introuvables. Ce n'est pas seulement pour l'OP mais pour tous ceux qui recherchent la même solution.
Aaron Lowe