Wiersz polecenia systemu Windows: jak uzyskać liczbę wszystkich plików w bieżącym katalogu?

24

Jakiego polecenia użyłbyś cmd.exedo znalezienia liczby plików w bieżącym katalogu?

Czy jest tutaj opcja PowerShell?

Aktualizacja : Miałem nadzieję uniknąć dir, ponieważ wiem, że w bieżącym katalogu jest ponad 10 000 plików. Chciał uniknąć wyliczenia danych wyjściowych do okna cmd. Dziękuję Ci!

p.campbell
źródło

Odpowiedzi:

27

Jeśli chcesz to zrobić cmd, to prosty sposób na zrobienie tego:

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

To zakłada linię poleceń. Zrobiłbyś to w pliku wsadowym

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

co robi coś ładniejszego. Możesz upuścić >nulwsadowo, ponieważ set /anie wyświetli wyniku, jeśli zostanie uruchomiony z pliku wsadowego - robi to bezpośrednio z wiersza poleceń. Ponadto %znak w forpętli musi zostać podwojony.

Widziałem całkiem sporo przypadków, w których ludzie próbują sprytnych sztuczek find /c. Bądź z nimi bardzo ostrożny, ponieważ różne rzeczy mogą to zepsuć.

Typowe błędy:

  1. Za pomocą find /c /vi spróbuj znaleźć coś, co nigdy nie jest zawarte w nazwie pliku, np ::. Przyzwyczajenie. Praca. Niezawodnie. Gdy okno konsoli jest ustawione na czcionki rastrowe, możesz uzyskać tę kombinację znaków. Mogę zawierać znaków w nazwie pliku, takie jak :, ?itp w ich pełnej szerokości wariantów na przykład, który będzie następnie zamieniony na ich normalne odpowiedniki ASCII, który złamie ten. Jeśli potrzebujesz dokładnej liczby, nie próbuj tego.

  2. Używając find /ci spróbuj znaleźć coś, co zawsze jest zawarte w nazwie pliku. Oczywiście kropka ( .) jest złym wyborem. Sugeruje inna odpowiedź

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

    który zakłada kilka rzeczy na temat ustawień użytkownika, z których nie wszystkie są gwarantowane (pozostawiłem komentarz szczegółowo opisujący problemy) i zwraca zbyt wiele wyników.

Ogólnie rzecz biorąc, chcesz użyć, findna dir /bktórym odcina się wszystkie elementy inne niż nazwa pliku i w ten sposób pozwala uniknąć błędów słupka ogrodzeniowego.

Zatem eleganckim wariantem byłoby:

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

który najpierw wyświetli wszystkie nazwy plików, po jednym wierszu. A następnie policz wszystkie wiersze tego wyjścia, które nie są puste. Ponieważ nazwa pliku nie może być pusta (chyba że czegoś mi brakuje, ale Unicode nie uruchomi tego zgodnie z moimi testami).

Joey
źródło
1
+1 Właśnie tego szukałem. Dziękuję JR!
p.campbell
Małe ulepszenie, aby pierwsza wersja była jedną linią: (ustaw liczbę = 0 i dla% x w (*) do @ (ustaw / a liczba + = 1> nul)) && echo% liczba%
Jason Massey
+1 zadir /b /a-d | find /c /v ""
Arvo Bowen
To rozwiązanie nie działa dobrze, gdy istnieją miliony plików. Działa „na zawsze” - poniżej opublikowano lepsze rozwiązanie, które działa „w kilka sekund” przy użyciu PS i [System.IO.Directory] :: GetFiles ($ path) .Count
ripvlan
@Jason, prawdopodobnie się nie powiedzie, ponieważ %count%jest on rozszerzany w czasie analizy.
Joey,
17

Zapytaj, a otrzymasz: http://technet.microsoft.com/en-us/library/ee692796.aspx

Zliczanie liczby elementów w folderze

Co wiesz: wygląda na to, że słońce w końcu wychodzi, co oznacza, że ​​już prawie pora, abyśmy odeszli. Jednak zanim to zrobimy, pokażemy Ci ostatnią małą sztuczkę za pomocą polecenia cmdlet Get-ChildItem. Czasami tak naprawdę nie trzeba dużo wiedzieć o plikach w folderze; wszystko, co naprawdę musisz wiedzieć, to ile plików (jeśli w ogóle) można znaleźć w danym folderze. Oto jak szybko policzyć liczbę plików w folderze:

(Get-ChildItem C:\Scripts).Count

Co my tu robimy? Po prostu używamy Get-ChildItem, aby zwrócić kolekcję wszystkich elementów znalezionych w folderze C: \ Scripts; ponieważ jest to kolekcja, musimy tylko powtórzyć wartość właściwości Count, która mówi nam o liczbie elementów w kolekcji. Zwróć uwagę na użycie nawiasów: umieszczamy polecenie Get-ChildItem w nawiasach, aby zapewnić, że program Windows PowerShell najpierw pobierze kolekcję, a dopiero potem powtórzy wartość właściwości Count dla tej kolekcji.

I oczywiście, możesz dołączyć filtr podczas wywoływania Get-ChildItem. Chcesz wiedzieć, ile plików .PS1 znajduje się w folderze C: \ Scripts? Spoko loko:

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

FYI .. Przeszukałem „pliki zliczania PowerShell”.

Trevoke
źródło
1
Musisz dodać specyfikację pliku, aby liczba rzeczywiście liczyć pliki, zgodnie z drugim przykładem
Jim B
3
Dla jasności (Get-ChildItem C: \ Scripts) .LICZBA NIE zwróci liczby plików w folderze, zwróci liczbę OBIEKTÓW w folderze. Musisz dodać filtr lub specyfikację pliku, aby umożliwić liczenie plików. wypróbuj (gci) .count i katalog z katalogu głównego dysku C: i spójrz na różnicę liczb
Jim B
4
Z tego samego linku, jeśli chcesz policzyć pliki również w podfolderach, użyj:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto
1
Nie działa, jeśli jest dokładnie jeden plik, musisz zrobić coś takiego: $ filecount = @ (get-childitem $ katalog-filtr " . ") .Count. Z tego, co przeczytałem gdzie indziej, nie jest to tablica, jeśli jest jeden plik.
NealWalters,
@NealWalters: To było poprawne do PowerShell v3. Od tego czasu to nie ma znaczenia.
Joey
8
dir /a-d | find "File(s)"

Słowo ostrzeżenia o używaniu programu PowerShell do takich prostych operacji na plikach - jest niesamowicie powolny w porównaniu do cmd.exe, szczególnie przez połączenia sieciowe lub gdy w katalogu są tysiące plików. Zobacz ten post na forum, aby uzyskać więcej informacji.

Rossnz
źródło
Jeśli twój system jest w innym języku niż angielski, będziesz mieć z tym problemy.
WalyKu,
7

dir daje całkowitą liczbę plików na dole.

lorenzog
źródło
1
1 kolego, pobiłeś mnie do tego :)
dyasny
2
i aby uniknąć kosztów oglądania, jak wszystkie linie przewijają się przez okno cmd ... zminimalizuj je, będzie działało DUŻO szybciej.
gbjbaanb
1
lub po prostu dir > file.. ahh tęsknię za POSIX
lorenzog
1
@lorenz: Jakiś powód, dla którego dir > filenie powinien działać w systemie Windows? Wiesz, przekierowanie wyjścia nie jest dokładnie magiczne.
Joey,
1
@ johannes: w rzeczywistości działa! Tęsknię za POSIX-em, ponieważ można „po prostu” zrobić, dir | grep (something)aby uniknąć powolnego zapisu na ekranie, który spowalnia działanie (i całkowicie go minimalizuje).
lorenzog,
7

Najszybszą metodą, jaką znalazłem, jest uruchomienie następujących poleceń w konsoli PS.

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

gdzie $ path to ścieżka lokalna lub udział UNC.

John Brooks
źródło
2
Spójrz na to. Prawidłowa, niesamowita odpowiedź pojawiła się prawie 7,5 roku po zadaniu pytania!
p.campbell
Pracowałem na serwerze wirtualnym w katalogu zawierającym ponad 2,1 miliona plików, aby zwrócić mi liczbę w około 10 sekund. To z pewnością powinna być poprawna odpowiedź.
DarrenMB
To naprawdę najlepsza odpowiedź. Miałem folder z 4,5 milionami plików i ta metoda policzyła je w kilka sekund. Metody w innych proponowanych odpowiedziach działały przez kilka minut, zanim się z nich zrezygnowałem.
ripvlan,
3

wystarczy policzyć linie z wyjścia dir / B (w tym katalogi):
dir /B | find /c /v "~~~"

po prostu policz pliki (bez katalogów):
dir /A-D /B | find /c /v "~~~"

Garcia
źródło
Zwraca to łącznie pliki i katalogi
TheCleaner
2

Znaleziono to w sieci:

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

Testowałem i wydaje się, że działa.

Kelsey
źródło
„Wydaje się, że” jest tutaj poprawnym słowem. (1) To jest w każdym przypadku wyłączone, ponieważ dirpolecenie zawiera wiersz z dwukropkiem, który nie jest plikiem. (2) Zależy to od formatu czasu, aby uwzględnić dwukropek, co niekoniecznie musi tak być. (3) Opiera się na formacie liczbowym bez dwukropka, co również niekoniecznie musi być. Poza tym przejrzenie pliku tutaj jest niepotrzebne i nie będzie działać, jeśli nie masz dostępu do zapisu - zły pomysł.
Joey,
Jak to zrobić bez tworzenia pliku „NUMfiles. ###”?
NickUnuchek
2

Tylko zastrzeżenie dla tych, którzy mogliby użyć powyższej odpowiedzi Trevoke PowerShell (wiersz polecenia systemu Windows: jak uzyskać liczbę wszystkich plików w bieżącym katalogu? ): Zgodnie z projektem echo właściwości Count kolekcji zwróconej przez Get-ChildItem może dawać mylące wyniki jeśli wartość wynosi 1 lub 0. Jest tak, ponieważ właściwość Count jest dostępna tylko dla tablic. Jeśli Get-ChildItem zwróci mniej niż 2 elementy, wynikiem jest skalar, a .Count nic nie zwraca. Aby obejść ten problem, jawnie wrzuć go do tablicy, np. @ (Get-ChildItem C: \ Scripts) .Count.

Aby uzyskać więcej informacji, zobacz http://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-file lub http://www.vistax64.com/powershell/266379 -get-childitem-count-not-working-one-file.html .

Heather M.
źródło
0

dir zwraca liczbę plików i katalogów na dole

dyasny
źródło
0

DIr oczywiście zadziała

Nie instalując niczego na serwerze, ale mając PowerShell na stacji roboczej, możesz:

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

to polecenie da ci wszystkie pliki (systemowe i ukryte zawarte) i, jak wspomniano wcześniej, jeśli PowerShell jest na komputerze, możesz po prostu

(GCI c:\*.*).count

Pamiętaj, że jeśli nie uwzględnisz . otrzymasz liczbę wszystkich plików i wszystkich katalogów. Nie uwzględnisz ukrytych i systemowych plików, które musisz dodać -force, aby policzyć je wszystkie

Jim B.
źródło
0

Gdybym potrzebował tego tylko raz, po prostu użyłbym dir, w przeciwnym razie rozważyłbym uruchomienie własnej, prawdopodobnie jako aplikacji C #, ponieważ to byłbym najbardziej zaznajomiony (chociaż VBScript lub PowerShell również byłyby wykonalne).

(Nawiasem mówiąc - to nie jest DOS, jeśli używasz cmd.exe)

Maximus Minimus
źródło
0

Wierzę, że możesz użyć atrybutu, aby uzyskać liczbę plików:

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

Spowoduje to utworzenie pliku o nazwie filecount.txt w bieżącym katalogu z liczbą plików i folderów w bieżącym katalogu (w tym nowo utworzonego pliku). Możesz zmienić

*.*

do

<full_path>\*.*

w celu uzyskania liczby plików określonego katalogu. Usuń opcję „/ D”, jeśli nie chcesz liczyć folderów. Opcja „/ s” przetwarza pliki we wszystkich katalogach w określonej ścieżce. Więc usuń go, jeśli chcesz tylko pliki w określonej ścieżce i nie chcesz dołączać plików do podfolderów.

Na przykład jeśli chcesz dowiedzieć się, ile plików znajduje się na dysku C: \, a nie w żadnym podfolderze, użyj polecenia:

attrib.exe C:\*.* | find /c /v "" >> filecount.txt
smoak
źródło
Używanie plików do wyników nie jest najmądrzejszym pomysłem. Co robisz, jeśli bieżący katalog nie jest przez Ciebie zapisywalny?
Joey,
@Johannes Używasz katalogu, do którego masz dostęp do zapisu? np. potokuj wyjście do C: \ MyWritableDir \ filecount.txt
smoak
Wciąż niepotrzebne.
Joey,
-2

Robię coś podobnego i działa to natychmiast z dowolną liczbą plików.

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
źródło
Po co publikować bezużyteczną (i wadliwą) odpowiedź na 6-letnie pytanie z już wieloma (dobrymi) odpowiedziami?
Massimo,
@Massimo, ponieważ nie byłem zadowolony z powyższych odpowiedzi i chciałem bardziej eleganckiego rozwiązania. Po co przeszkadzać w pogoni za wiedzą, która nie jest ograniczona czasowo?
Aaron Lowe
Urgh! Odpowiedzi wyglądają okropnie. Edytowane rozwiązanie do odpowiedzi. Nie trzeba mi dziękować Uwielbiam negatywnych przedstawicieli za pomoc innym :-P
Aaron Lowe
Naprawdę nie ma powodu, aby używać pliku tymczasowego do przechowywania danych wyjściowych; także używanie findnie jest dobrym pomysłem. Szczegółowe informacje można znaleźć w zaakceptowanej odpowiedzi.
Massimo
@Massimo Odpowiedziałem na twoje pytanie. Jesteś mi winien odpowiedź. Jeśli możesz mi pokazać, jak unikać używania pliku tymczasowego, docenię to. Przeczytałem już wszystkie odpowiedzi i dlatego opublikowałem własne. Zakładasz, że ponieważ odpowiedź została zaakceptowana, nie można znaleźć nowych odpowiedzi. To nie tylko dla OP, ale dla wszystkich, którzy szukają tego samego rozwiązania.
Aaron Lowe