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


24

Яку команду ви б використали, cmd.exeщоб знайти кількість файлів у поточному каталозі?

Чи є тут варіант з власною оболонкою?

Оновлення : Я сподівався уникнути dir, оскільки знаю, що в поточному каталозі є 10 000+ файлів. Хотів уникнути виведення перерахунку до вікна 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якому вирізаєте всі речі, що не належать до імені файлу, і таким чином уникаєте помилок забору.

Таким елегантним варіантом буде:

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

який спочатку виведе всі назви файлів, по одному рядку. А потім порахуйте всі рядки цього виводу, які не порожні. Оскільки ім’я файлу не може бути порожнім (якщо я чогось не пропускаю, але Unicode не виправить це згідно моїх тестів).


1
+1 Саме це я і шукав. Дякую, молодший!
p.campbell

Невеликий твір, щоб зробити 1-ю версію всього одного рядка: (встановити кількість = 0 & для% x у (*) do @ (set / a count + = 1> nul)) && echo% count%
Jason Massey

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

Це рішення не працює добре, коли є мільйони файлів. Він працює "назавжди" - нижче розміщено краще рішення, яке працює "за секунди" за допомогою PS та [System.IO.Directory] :: GetFiles ($ path)
.Count

@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? Окей-док:

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

FYI .. Я гуглив "powerhell count файли".


1
Вам потрібно додати filepec, щоб змусити насправді рахувати файли, як показано на другому прикладі
Jim B

3
Просто, щоб було зрозуміло (Get-ChildItem C: \ Scripts) .Count НЕ поверне кількість файлів у папці, вона поверне кількість ОБ'ЄКТІВ у папці. Ви повинні додати специфікацію фільтра або файлу, щоб змусити його рахувати файли. спробуйте (gci) .count та dir від кореня вашого C: їдьте і подивіться на різницю в цифрах
Jim B

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 надає загальний підрахунок файлів внизу.


1
1 Ви,
приятелю

2
і щоб уникнути витрат на перегляд усіх рядків, прокручуючи вікно cmd ... мінімізуйте це, воно працюватиме ШМЕ швидше.
gbjbaanb

1
або просто dir > file.. ах я сумую POSIX
lorenzog

1
@lorenz: Будь-яка причина, чому dir > fileне слід працювати в Windows? Перенаправлення виводу - це не зовсім магія.
Джої

1
@johannes: це справді працює! Я сумую за POSIX, тому що ви могли "просто" зробити це, dir | grep (something)щоб уникнути повільного запису на екрані, який уповільнює роботу (і мінімізує її взагалі).
lorenzog

7

Найшвидший спосіб, який я знайшов - це запустити наступне на консолі PS.

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

де $ path - це локальний шлях або частка UNC.


2
Подивіться на це. Дійсна дивовижна відповідь з’явилася майже через 7,5 років після того, як було задано питання!
p.campbell

Працював над віртуальним сервером у каталозі з понад 2,1 мільйонами файлів, щоб повернути підрахунок приблизно за 10 секунд. Це точно має бути правильна відповідь.
DarrenMB

Це справді найкраща відповідь. У мене була папка з 4,5 мільйонами файлів у ній, і цей метод підрахував їх за кілька секунд. Методи в інших запропонованих відповідях пробігали кілька хвилин, перш ніж я відмовився від них.
ripvlan

3

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

для лише підрахунку файлів (без dirs):
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 повертає менше двох елементів, результат є скалярним, а .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, звичайно, спрацює

Не встановлюючи щось на сервері, але не маючи оболонки повноважень на своїй робочій станції, ви можете зробити:

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

ця команда дасть вам усі файли (системні та приховані включені), і як уже згадувалося, якщо на машині знаходиться паттерн, ви можете просто

(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

Використання файлів для отримання результатів - не найрозумніша ідея. Що ви робите, якщо поточний каталог не піддається написанню вами?
Joey

@Johannes Використовуйте каталог, у який ви маєте доступ до запису? наприклад, передайте вихід на C: \ MyWritableDir \ filecount.txt
smoak

Все-таки непотрібне.
Джої

-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, тому що я не був задоволений відповідями вище і хотів більш елегантного рішення. Чому варто стояти на шляху пошуку знань, які не обмежені часом?
Аарон Лоу

Урх! Відповіді виглядають жахливо. Відредаговане рішення у відповідь. Не потрібно дякувати мені, я люблю негативну репутацію за допомогу іншим :-P
Аарон Лоу

Дійсно немає причин використовувати тимчасовий файл, щоб утримати деякий вихід; Крім того, використання findне є хорошою ідеєю. Деталі див. У прийнятій відповіді.
Массімо

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