Símbolo del sistema de Windows: ¿cómo obtener el recuento de todos los archivos en el directorio actual?

24

¿Qué comando usarías cmd.exepara encontrar la cantidad de archivos en el directorio actual?

¿Hay una opción de PowerShell aquí?

Actualización : esperaba evitarlo dir, ya que sé que hay más de 10,000 archivos en el directorio actual. Quería evitar la salida de enumeración a la ventana de cmd. ¡Gracias!

p.campbell
fuente

Respuestas:

27

Si desea hacerlo cmd, la siguiente es la forma trivial de hacerlo:

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

Eso supone la línea de comando. En un archivo por lotes harías

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

que hace las cosas un poco mejor. Puede soltarlo >nulen un lote, ya set /aque no mostrará el resultado si se ejecuta desde un archivo por lotes, lo hace directamente desde la línea de comandos. Además, el %signo en el forbucle debe duplicarse.

He visto bastantes casos en los que las personas prueban trucos ingeniosos find /c. Tenga mucho cuidado con eso, ya que varias cosas pueden romper esto.

Errores comunes:

  1. Usa find /c /ve intenta encontrar algo que nunca se incluye en un nombre de archivo, como ::. No lo haré Trabajo. Seguramente. Cuando la ventana de la consola está configurada con fuentes ráster, puede obtener esa combinación de caracteres. Puedo incluir caracteres en un nombre de archivo como :, ?etc., en sus variantes de ancho completo, por ejemplo, que luego se convertirán a sus contrapartes ASCII normales, lo que romperá esto. Si necesita un conteo preciso, no intente esto.

  2. Usa find /ce intenta encontrar algo que siempre se incluya en un nombre de archivo. Obviamente el punto ( .) es una mala elección. Otra respuesta sugiere

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

    que asume varias cosas sobre la configuración regional del usuario, no todas las cuales se garantiza que sean ciertas (he dejado un comentario que detalla los problemas allí) y devuelve un resultado demasiado.

En general, desea usar finden el dir /bque se eliminan todos los elementos que no son de nombre de archivo y se evitan así los errores de poste de cerca.

Entonces la variante elegante sería:

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

que primero mostrará todos los nombres de archivo, una línea cada uno. Y luego cuente todas las líneas de esa salida que no estén vacías. Dado que el nombre del archivo no puede estar vacío (a menos que me falte algo, pero Unicode no lo activará de acuerdo con mis pruebas).

Joey
fuente
1
+1 Eso era exactamente lo que estaba buscando. Gracias JR!
p.campbell
Pequeño ajuste para hacer que la primera versión sea una sola línea: (set count = 0 & for% x in (*) do @ (set / a count + = 1> nul)) && echo% count%
Jason Massey
+1 paradir /b /a-d | find /c /v ""
Arvo Bowen
Esta solución no funciona bien cuando hay millones de archivos. Se ejecuta "para siempre": a continuación se publica una solución mejor que se ejecuta "en segundos" usando PS y [System.IO.Directory] :: GetFiles ($ path) .Count
ripvlan
@jason, eso probablemente fallaría ya que %count%se expande en el momento del análisis.
Joey el
17

Pregunte y recibirá: http://technet.microsoft.com/en-us/library/ee692796.aspx

Contando el número de elementos en una carpeta

Bueno, qué sabes: parece que el sol finalmente está saliendo, lo que significa que es casi la hora de irnos. Sin embargo, antes de hacerlo, le mostraremos un último truco con el cmdlet Get-ChildItem. A veces, realmente no necesita saber mucho acerca de los archivos en una carpeta; todo lo que realmente necesita saber es cuántos archivos (si hay alguno) se pueden encontrar en una carpeta en particular. Aquí le mostramos cómo puede contar rápidamente la cantidad de archivos en una carpeta:

(Get-ChildItem C:\Scripts).Count

¿Qué estamos haciendo aquí? Simplemente estamos usando Get-ChildItem para devolver una colección de todos los elementos encontrados en la carpeta C: \ Scripts; Como se trata de una colección, todo lo que tenemos que hacer es recuperar el valor de la propiedad Count, que nos indica el número de elementos de la colección. Tenga en cuenta el uso de paréntesis: adjuntamos el comando Get-ChildItem entre paréntesis para garantizar que Windows PowerShell primero tome la colección y solo luego haga eco del valor de la propiedad Count para esa colección.

Y claro, puede incluir un filtro cuando llame a Get-ChildItem. ¿Necesita saber cuántos archivos .PS1 hay en la carpeta C: \ Scripts? Okey-doke:

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

FYI ... busqué en Google "archivos de recuento de PowerShell".

Trevoke
fuente
1
Debe agregar una especificación de archivo para que el recuento realmente cuente archivos, según el segundo ejemplo
Jim B
3
Para ser claros (Get-ChildItem C: \ Scripts) .Count NO devolverá el número de archivos en una carpeta, devolverá el número de OBJETOS en una carpeta. Debe agregar un filtro o una especificación de archivo para que cuente los archivos. intente (gci) .count y dir desde la raíz de su unidad C: y observe la diferencia en números
Jim B
44
Desde ese mismo enlace, si también desea contar archivos en las subcarpetas, use:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto
1
No funciona si hay exactamente un archivo, tiene que hacer algo como esto: $ filecount = @ (get-childitem $ directory -filter " . ") .Count. Por lo que leí en otra parte, no es una matriz si hay un archivo.
NealWalters
@NealWalters: Esto fue correcto hasta PowerShell v3. Desde entonces no importa.
Joey
8
dir /a-d | find "File(s)"

Una advertencia sobre el uso de PowerShell para operaciones de archivo simples como esta: es increíblemente lento en comparación con cmd.exe, especialmente a través de conexiones de red o cuando hay miles de archivos en el directorio. Vea esta publicación en el foro para más información.

Rossnz
fuente
Si su sistema está en un idioma diferente al inglés, tendrá problemas con esto.
WalyKu
7

dir le da el recuento total de archivos en la parte inferior.

lorenzog
fuente
1
1 Up mate, me
ganaste
2
y para evitar el costo de ver todas las líneas desplazarse a través de la ventana de cmd ... minimizarlo, funcionará MUCHO más rápido.
gbjbaanb
1
o simplemente dir > file.. ahh me olvido de POSIX
lorenzog
1
@lorenz: ¿Alguna razón por la dir > fileque no debería funcionar en Windows? La redirección de salida no es exactamente mágica, ya sabes.
Joey
1
@johannes: de hecho funciona. Echo de menos POSIX porque podría "simplemente" hacer dir | grep (something)para evitar la escritura lenta en pantalla que ralentiza las cosas (y la minimiza por completo).
lorenzog
7

El método más rápido que he encontrado es ejecutar lo siguiente en la consola PS.

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

donde $ ruta es una ruta local o un recurso compartido UNC.

John Brooks
fuente
2
Mira eso. ¡Una respuesta impresionante válida apareció casi 7.5 años después de que se hizo la pregunta!
p.campbell
Trabajé en un servidor virtual en un directorio con más de 2.1 millones de archivos para devolver el conteo en aproximadamente 10 segundos para mí. Esta debería ser la respuesta correcta con seguridad.
DarrenMB
Esta es realmente la mejor respuesta. Tenía una carpeta con 4.5 millones de archivos y este método los contó en varios segundos. Los métodos en otras respuestas propuestas funcionaron durante varios minutos antes de que me diera por vencido.
ripvlan
3

solo cuente las líneas de la salida dir / B (directorios incluidos):
dir /B | find /c /v "~~~"

solo para contar archivos (sin directorios):
dir /A-D /B | find /c /v "~~~"

Garcia
fuente
Esto devuelve los archivos y el recuento de directorios como un total
TheCleaner
2

Encontré esto en la red:

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

Lo probé y parece funcionar.

Kelsey
fuente
"Parece que" es la palabra correcta aquí. (1) Esto está desactivado por uno en cualquier caso, ya que el dircomando incluye una línea con dos puntos que no es un archivo. (2) Esto se basa en el formato de hora para incluir dos puntos, que no necesariamente tiene que ser así. (3) Se basa en el formato de número sin incluir dos puntos, que tampoco necesariamente tiene que ser así. Además, revisar un archivo aquí es innecesario y no funcionará si no tiene acceso de escritura, mala idea.
Joey
¿Cómo hacerlo sin crear el archivo "NUMfiles. ###"?
NickUnuchek
2

Solo una advertencia para aquellos que podrían usar la respuesta de PowerShell de Trevoke anterior ( símbolo del sistema de Windows: ¿cómo obtener el recuento de todos los archivos en el directorio actual? ): Por diseño, hacer eco de la propiedad Count de una colección devuelta por Get-ChildItem puede dar resultados engañosos si el valor es 1 o 0. Esto se debe a que la propiedad Count solo está disponible en matrices. Si Get-ChildItem devuelve menos de 2 elementos, el resultado es escalar y .Count no devuelve nada. Para evitar esto, explíquelo explícitamente en una matriz, por ejemplo, @ (Get-ChildItem C: \ Scripts) .Count.

Para obtener más información, consulte 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 .

Heather M.
fuente
0

dir devuelve el número de archivos y directorios en la parte inferior

dyasny
fuente
0

DIr por supuesto funcionará

Sin instalar algo en el servidor pero con powershell en su estación de trabajo, podría hacer:

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

ese comando le dará todos los archivos (sistema y oculto incluidos) y, como se mencionó anteriormente, si powershell está en la máquina, simplemente puede

(GCI c:\*.*).count

Tenga en cuenta que si no incluye el . obtendrá un recuento de todos los archivos y todos los directorios. No incluirá archivos ocultos y del sistema que necesita agregar -force para contarlos a todos

Jim B
fuente
0

Si solo necesitara esto una vez, solo usaría dir, de lo contrario, consideraría crear el mío, probablemente como una aplicación C # porque eso es con lo que estaría más familiarizado (aunque VBScript o PowerShell también serían viables).

(Por cierto, no es DOS si está usando cmd.exe)

Maximus Minimus
fuente
0

Creo que puede usar attrib para obtener el recuento de archivos:

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

Esto creará un archivo llamado filecount.txt en el directorio actual con el número de archivos y carpetas en el directorio actual (incluido el archivo recién creado). Puedes cambiar el

*.*

a

<full_path>\*.*

para obtener el recuento de archivos de un directorio particular. Elimine la opción "/ D" si no desea contar las carpetas. La opción "/ s" procesa archivos en todos los directorios en la ruta especificada. Así que elimínelo si solo desea archivos en la ruta especificada y no desea incluir archivos en subcarpetas.

Entonces, por ejemplo, si desea averiguar cuántos archivos hay en su unidad C: \ y no en ninguna subcarpeta, usaría el comando:

attrib.exe C:\*.* | find /c /v "" >> filecount.txt
fumar
fuente
Usar archivos para obtener resultados no es la idea más inteligente. ¿Qué haces si el directorio actual no se puede escribir?
Joey
@Johannes ¿Utiliza un directorio al que tiene acceso de escritura? por ejemplo, canalice la salida a C: \ MyWritableDir \ filecount.txt
fume
Sigue siendo innecesario.
Joey
-2

Estoy haciendo algo similar y esto funciona con cualquier número de archivos al instante.

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
fuente
¿Por qué publicar una respuesta inútil (y defectuosa) a una pregunta de 6 años con muchas respuestas (buenas)?
Massimo
@Massimo porque no estaba satisfecho con las respuestas anteriores y quería una solución más elegante. ¿Por qué interponerse en la búsqueda del conocimiento que no está limitado por el tiempo?
Aaron Lowe
Urgh! Las respuestas se ven horribles. Solución editada en respuesta. No hay necesidad de agradecerme. Me encanta la reputación negativa por ayudar a otros :-P
Aaron Lowe
Realmente no hay razón para usar un archivo temporal para contener algo de salida; Además, el uso findno es una buena idea. Vea la respuesta aceptada para más detalles.
Massimo
@ Massimo, respondí tu pregunta. Me debes una respuesta a la mía. Si me puede mostrar cómo evitar usar el archivo temporal, lo agradecería. Ya leí todas las respuestas, por eso publiqué la mía. Está suponiendo que debido a que se acepta una respuesta, no se pueden encontrar nuevas respuestas. No es solo para el OP, sino para todos los que buscan la misma solución.
Aaron Lowe