Командная строка Windows: как узнать количество всех файлов в текущем каталоге?


24

Какую команду вы бы использовали cmd.exeдля определения количества файлов в текущем каталоге?

Здесь есть опция powershell?

Обновление : я надеялся избежать dir, поскольку я знаю, что в текущем каталоге более 10000 файлов. Хотел избежать вывода перечисления в окно cmd. Спасибо!

Ответы:


27

Если вы хотите сделать это cmd, то вот тривиальный способ сделать это:

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

Это предполагает командную строку. В командном файле вы бы сделали

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

что делает вещи немного лучше. Вы можете оставить >nulв пакете, так set /aкак не будет отображать результат, если запустить из пакетного файла - он делает это непосредственно из командной строки. Кроме того, %знак в forцикле должен быть удвоен.

Я видел довольно много случаев, когда люди пробовали отличные трюки find /c. Будьте очень осторожны с этим, поскольку различные вещи могут сломать это.

Распространенные ошибки:

  1. Используя find /c /vи попробуйте найти что-то, что никогда не входит в имя файла, например ::. Не будет. Работа. Достоверно. Когда в окне консоли установлены растровые шрифты, вы можете получить эти комбинации символов. Я могу включать символы в имени файла , например :, ?и т.д. в их полной ширине вариантов, например, которые затем преобразуются в их обычных ASCII - аналоги , которые будут нарушать это. Если вам нужен точный счет, не пытайтесь это сделать.

  2. Используйте find /cи попробуйте найти то, что всегда включено в имя файла. Очевидно, точка ( .) - плохой выбор. Другой ответ предполагает

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

    который предполагает несколько вещей о локали пользователя, не все из которых гарантированно верны (я оставил комментарий с подробным описанием проблем) и возвращает один результат слишком много.

Как правило, вы хотите использовать findна dir /bкоторый отсекает все без файла вещи и позволяет избегать ошибок fencepost таким образом.

Таким образом, элегантный вариант будет:

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

который сначала выведет все имена файлов, по одной строке. А затем посчитайте все строки того вывода, которые не пусты. Поскольку имя файла не может быть пустым (если я не пропустил что-то, но Unicode не запутает это согласно моим тестам).


1
+1 Это было именно то, что я искал. Спасибо, JR!
p.campbell

Небольшая настройка, чтобы сделать первую версию одной строкой: (установите count = 0 & для% x в (*) do @ (set / a count + = 1> nul)) && echo% count%
Джейсон Мэсси,

+1 заdir /b /a-d | find /c /v ""
Арво Боуэн

Это решение не работает, когда есть миллионы файлов. Он работает «навсегда» - ниже опубликовано лучшее решение, которое работает «за секунды» с использованием PS и [System.IO.Directory] :: GetFiles ($ path) .Count
ripvlan

@ jason, это, вероятно, потерпит неудачу, поскольку %count%расширяется во время разбора.
Джои

17

Спросите, и вы получите: http://technet.microsoft.com/en-us/library/ee692796.aspx

Подсчет количества предметов в папке

Ну, что вы знаете: похоже, что солнце наконец-то выходит, а значит, нам почти пора уходить. Однако, прежде чем мы это сделаем, давайте покажем вам последний маленький трюк с командлетом Get-ChildItem. Иногда вам не нужно много знать о файлах в папке; все, что вам действительно нужно знать, - это сколько файлов (если они есть) можно найти в определенной папке. Вот как вы можете быстро посчитать количество файлов в папке:

(Get-ChildItem C:\Scripts).Count

Что мы здесь делаем? Мы просто используем Get-ChildItem, чтобы вернуть коллекцию всех элементов, найденных в папке C: \ Scripts; поскольку это коллекция, все, что нам нужно сделать, - это вернуть значение свойства Count, которое сообщает нам количество элементов в коллекции. Обратите внимание на использование круглых скобок: мы заключаем команду Get-ChildItem в круглые скобки, чтобы гарантировать, что Windows PowerShell сначала захватывает коллекцию, а затем возвращает значение свойства Count для этой коллекции.

И конечно, вы можете включить фильтр при вызове Get-ChildItem. Нужно знать, сколько файлов .PS1 находится в папке C: \ Scripts? Окей-doke:

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

К вашему сведению ... Я гуглил "файлы подсчета PowerShell".


1
Вам нужно добавить спецификацию файлов, чтобы счетчик действительно подсчитывал количество файлов, как во втором примере
Джим Б

3
Просто чтобы прояснить (Get-ChildItem C: \ Scripts) .Count НЕ будет возвращать количество файлов в папке, оно будет возвращать количество ОБЪЕКТОВ в папке. Вы должны добавить фильтр или спецификацию файла, чтобы заставить его считать файлы. попробуйте (gci) .count и dir из корня диска C: и посмотрите на разницу в числах
Джим Б

4
По той же ссылке, если вы хотите посчитать файлы в подпапках, тоже используйте:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto

1
Не работает, если есть только один файл, нужно сделать что-то вроде этого: $ filecount = @ (get-childitem $ directory -filter " . ") .Count. Из того, что я читал в другом месте, это не массив, если есть один файл.
NealWalters

@NealWalters: это было правильно до PowerShell v3. С тех пор это не имеет значения.
Джои

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

Предупреждение об использовании PowerShell для таких простых файловых операций, как этот - он невероятно медленный по сравнению с cmd.exe, особенно по сетевым подключениям или когда в каталоге находятся тысячи файлов. Смотрите этот пост на форуме для получения дополнительной информации.


Если ваша система на другом языке, чем английский, у вас будут проблемы с этим.
WalyKu

7

dir дает вам общее количество файлов в нижней части.



2
и чтобы избежать затрат на просмотр всех строк, прокручиваемых через окно cmd ... свести его к минимуму, это будет работать намного быстрее.
gbjbaanb

1
или просто dir > file.. ааа, я скучаю по POSIX
lorenzog

1
@lorenz: Любая причина, почему dir > fileне должен работать в Windows? Знаете, перенаправление вывода не совсем волшебно.
Джои

1
@ Johannes: это работает, на самом деле! Я скучаю по POSIX, потому что вы могли бы "просто" сделать так, dir | grep (something)чтобы избежать медленной записи на экране, которая замедляет работу (и сводит ее к минимуму).
Лоренцог

7

Самый быстрый способ, который я нашел, - запустить следующее в консоли PS.

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

где $ path - это локальный путь или общий ресурс UNC.


2
Посмотри на это. Действительный офигительный ответ появился почти через 7,5 лет после того, как был задан вопрос!
p.campbell

Работал на виртуальном сервере в каталоге с более чем 2,1 миллиона файлов, чтобы вернуть мне счет за 10 секунд. Это должен быть правильный ответ наверняка.
DarrenMB

Это действительно лучший ответ. У меня была папка с 4,5 миллионами файлов, и этот метод подсчитывал их за несколько секунд. Методы в других предложенных ответах работали в течение нескольких минут, прежде чем я отказался от них.
Рипвлан

3

просто посчитайте строки из вывода dir / B (включая каталоги):
dir /B | find /c /v "~~~"

просто для подсчета файлов (без каталогов):
dir /A-D /B | find /c /v "~~~"


Возвращает общее количество файлов и каталогов
TheCleaner

2

Нашел это в сети:

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

Я проверил, и это похоже на работу.


«Кажется,» здесь правильное слово. (1) Это в любом случае отключено одним, так как dirкоманда включает в себя строку с двоеточием, которая не является файлом. (2) Это зависит от формата времени для включения двоеточия, что не обязательно должно быть так. (3) Он основан на числовом формате, не включая двоеточие, что также не обязательно должно быть таковым. Кроме того, просмотр файла здесь не нужен и не будет работать, если у вас нет прав на запись - плохая идея.
Джои

Как сделать это без создания файла "NUMfiles. ###"?
NickUnuchek

2

Просто предостережение для тех, кто может использовать приведенный выше ответ PowerShell от Trevoke (командная строка Windows: как получить счетчик всех файлов в текущем каталоге? ): По своему замыслу отображение свойства Count коллекции, возвращаемой Get-ChildItem, может дать неверные результаты если значение равно 1 или 0. Это связано с тем, что свойство Count доступно только для массивов. Если Get-ChildItem возвращает менее 2 элементов, результат является скалярным, а .Count ничего не возвращает. Чтобы обойти это, явно приведите его к массиву, например, @ (Get-ChildItem C: \ Scripts) .Count.

Для получения дополнительной информации см. Http://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-file или http://www.vistax64.com/powershell/266379. -get-childitem-count-not-working-one-file.html .


0

dir возвращает количество файлов и каталогов внизу


0

Буду конечно работать

Не устанавливая что-либо на сервер, но имея PowerShell на своей рабочей станции, вы можете сделать:

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

эта команда выдаст вам все файлы (включая системные и скрытые), и, как уже упоминалось ранее, если на машине есть powershell, вы можете просто

(GCI c:\*.*).count

Обратите внимание, что если вы не включите . Вы получите количество всех файлов и всех каталогов. Вы не будете включать скрытые и системные файлы, которые нужно добавить -force, чтобы подсчитать их все


0

Если бы мне это понадобилось только один раз, я бы просто использовал dir, в противном случае я бы подумал о том, чтобы развернуть свое собственное, вероятно, как приложение на C #, потому что это то, с чем я был бы наиболее знаком (хотя VBScript или PowerShell также были бы жизнеспособны).

(Кстати - это не DOS, если вы используете cmd.exe)


0

Я считаю, что вы можете использовать attrib, чтобы получить количество файлов:

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

Это создаст файл с именем filecount.txt в текущем каталоге с количеством файлов и папок в текущем каталоге (включая вновь созданный файл). Вы можете изменить

*.*

в

<full_path>\*.*

для того, чтобы получить количество файлов определенного каталога. Удалите опцию «/ D», если вы не хотите считать папки. Параметр "/ s" обрабатывает файлы во всех каталогах по указанному пути. Поэтому удалите его, если вам нужны только файлы по указанному пути и вы не хотите включать файлы в подпапки.

Например, если вы хотите узнать, сколько файлов находится на вашем диске C: \, а не в какой-либо подпапке, используйте команду:

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

Использование файлов для результатов - не самая разумная идея. Что вы делаете, если текущий каталог не доступен для записи?
Джои

@Johannes Использовать каталог, к которому у вас есть права на запись? например, направить вывод в C: \ MyWritableDir \ filecount.txt
курить

Все еще не нужно.
Джои

-2

Я делаю нечто подобное, и это работает с любым количеством файлов мгновенно.

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.

Зачем публиковать бесполезный (и некорректный) ответ на 6-летний вопрос с уже большим количеством (хороших) ответов?
Массимо

@Massimo, потому что я не был удовлетворен ответами выше и хотел более элегантное решение. Зачем стоять на пути поиска знаний, не ограниченных временем?
Аарон Лоу

Urgh! Ответы выглядят ужасно. Отредактировано решение в ответ. Не нужно благодарить меня. Я люблю отрицательного представителя за помощь другим :-P
Аарон Лоу,

На самом деле нет никакой причины использовать временный файл для хранения некоторого вывода; Кроме того, использование findне очень хорошая идея. Смотрите принятый ответ для деталей.
Массимо

@Massimo Я ответил на твой вопрос. Вы должны мне ответить на мой. Если вы можете показать мне, как избежать использования временного файла, я был бы признателен за это. Я уже прочитал все ответы, поэтому я отправил свои собственные. Вы предполагаете, что поскольку ответ принят, новые ответы не могут быть найдены. Это не только для ОП, но и для всех, кто ищет одно и то же решение.
Аарон Лоу
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.