Windows komut istemi: Geçerli dizindeki tüm dosyaların sayısını nasıl alabilirim?


24

cmd.exeGeçerli dizindeki dosya sayısını bulmak için hangi komutu kullanırsınız ?

Burada bir powershell seçeneği var mı?

Güncelleme : dirGeçerli dizinde 10.000'den fazla dosya olduğunu bildiğim için kaçınmayı umuyordum . Cmd penceresine numaralandırma çıkışını önlemek istedi. Teşekkür ederim!

Yanıtlar:


27

Bunu yapmak istiyorsanız cmd, aşağıdakiler yapmanın en önemsiz yoludur:

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

Bu komut satırını farz ediyor. Bir toplu iş dosyasında yapardın

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

hangi işler biraz daha güzel. >nulBir toplu iş içinde bırakabilirsiniz , çünkü set /abir toplu iş dosyasından çalıştırıldığında sonucu görüntülemez - doğrudan komut satırından çıkar. Ayrıca, döngü içindeki %işaret foriki katına çıkarılmalıdır.

İnsanların şık numaralar denediği birkaç örnek gördüm find /c. Bunlara çok dikkat edin, çünkü çeşitli şeyler bunu kırabilir.

Yaygın hatalar:

  1. Kullanımı find /c /vve asla bir dosya adına dahil edilmemiş bir şey bulmayı deneyin ::. Alışkanlık. İş. Güvenilir. Konsol penceresi raster yazı tiplerine ayarlandığında, bu karakter kombinasyonunu elde edebilirsiniz . Ben gibi bir dosya adı karakterleri içerebilir :, ?vb sonra bu kıracak normal ASCII muadillerine dönüştürülür alacak örneğin tam genişlikli varyantları, içinde. Doğru bir sayıma ihtiyacınız varsa, o zaman bunu denemeyin.

  2. Kullanarak her zaman bir dosya adına dahil olan bir find /cşeyi bulmayı deneyin . Açıkçası nokta ( ) kötü bir seçimdir. Başka bir cevap önerir.

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

    kullanıcının yerel ayarları hakkında bir şeyler varsayarsak, bunların hepsinin gerçek olacağı garanti edilmez (oradaki sorunları ayrıntılandıran bir yorum bıraktım) ve çok fazla sonuç döndürdü.

Genellikle, kullanmak istediğiniz findüzerindeki dir /bkesikler uzakta olmayan tüm dosya şeyler ve kaçınır bu şekilde hataları fencepost hangi.

Yani şık değişken:

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

ilk önce tüm dosya isimlerini, her biri bir satır çıktısını alacak. Sonra boş olmayan tüm çıktıları sayın. Dosya adı boş olamayacağından (bir şey eksik olmadıkça, ancak Unicode testlerime göre bunu açmayacak).


1
+1 Tam olarak aradığım şey buydu. Teşekkürler JR!
p.campbell

Küçük çimdik 1 sürüm hepsi bir çizgi yapmak için: (set sayısı = 0 &% x in (*) do @ (set / deyince + = 1> nul) için) && echo% count%
Jason Massey

+1 içindir /b /a-d | find /c /v ""
Arvo Bowen

Milyonlarca dosya olduğunda bu çözüm iyi çalışmaz. Bu "sonsuza dek" çalışır - daha iyi bir çözüm PS ve [System.IO.Directory] :: GetFiles ($ yol) .Count kullanarak "saniyeler içinde" o koşular altında yayınlanmıştır
ripvlan

@jason, muhtemelen %count%ayrıştırma zamanında genişletildiğinden beri başarısız olur .
Joey

17

İsteyin ve alacaksınız: http://technet.microsoft.com/en-us/library/ee692796.aspx

Bir Klasördeki Ürün Sayısını Sayma

Peki, ne biliyorsun: Güneş nihayet çıkıyormuş gibi görünüyor, bu da bizim gitmemizin tam zamanı. Ancak, yapmadan önce, size Get-ChildItem cmdlet'iyle son bir numara gösterelim. Bazen bir klasördeki dosyalar hakkında çok fazla şey bilmeniz gerekmez; Gerçekten bilmeniz gereken tek şey, belirli bir klasörde (varsa) kaç tane dosyanın bulunabileceğidir. Bir klasördeki dosya sayısını hızlı bir şekilde saymanın yolu:

(Get-ChildItem C:\Scripts).Count

Burada ne yapıyoruz? Biz sadece C: \ Scripts klasöründe bulunan tüm öğelerin bir koleksiyonunu döndürmek için Get-ChildItem kullanıyoruz; çünkü bu bir koleksiyon, tek yapmamız gereken, koleksiyondaki öğe sayısını bize söyleyen Count özelliğinin değerini tekrarlamak. Parantezlerin kullanıldığına dikkat edin: Windows PowerShell'in önce koleksiyonu almasını ve sonra o koleksiyonun Count özelliğinin değerini geri almasını sağlamak için Get-ChildItem komutunu parantez içine alın.

Ve elbette, Get-ChildItem'i çağırırken bir filtre de ekleyebilirsiniz. C: \ Scripts klasöründe kaç tane .PS1 dosyası bulunduğunu bilmeniz mi gerekiyor? Okey-doke:

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

Bilginize .. googled "powershell count dosyaları".


1
İkinci örnekte olduğu gibi sayının gerçekte dosyaları saymasını sağlamak için bir filepec eklemeniz gerekir
Jim B

3
Sadece açık olması gerekir (Get-ChildItem C: \ Scripts) .Count, bir klasördeki dosyaların sayısını döndürmez, bir klasördeki OBJECTS sayısını döndürür. Dosyaları saymak için bir filtre veya dosya belirtimi eklemelisiniz. deneyin (gci) .count ve dir. C'nizin kök dizininden: sürün ve sayıdaki farka bakın
Jim B

4
Aynı bağlantıdan, alt klasörlerdeki dosyaları saymak istiyorsanız da kullanın:(Get-ChildItem -recurse -filter "*.ps1").Count
jrsconfitto

1
Tam olarak bir dosya varsa işe yaramaz, böyle bir şey yapmak zorunda: $ filecount = @ (get-childitem $ dizin -dosyası " . ") .Count. Başka bir yerde okuduklarımdan, bir dosya varsa, bu bir dizi değil.
NealWalters

@NealWalters: PowerShell v3'e kadar doğruydu. O zamandan beri önemli değil.
Joey

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

Bu gibi basit dosya işlemleri için PowerShell'i kullanma hakkında bir uyarı - bu, özellikle ağ bağlantıları üzerinden veya dizinde binlerce dosya varken cmd.exe'ye kıyasla inanılmaz derecede yavaştır. Daha fazla bilgi için bu forum yayınına bakın .


Sisteminiz İngilizce'den farklı bir dilde ise, bununla ilgili sorunlarınız olur.
WalyKu

7

dir altta toplam dosya sayısını verir.



2
ve tüm çizgilerin cmd penceresinden ilerlemesini izlemenin maliyetinden kaçınmak için ... minimize edin, çok daha hızlı çalışacaktır.
gbjbaanb

1
ya da sadece dir > file.. ahh
POSIX'i

1
@lorenz: Neden dir > fileWindows'ta çalışmamalıyım? Çıktı yönlendirmesi tam olarak sihirli değil, biliyorsun.
Joey,

1
@johannes: Aslında işe yarıyor! POSIX'i özlüyorum, çünkü dir | grep (something)işleri yavaşlatan (ve tamamen minimize eden) ekrana yavaş yazmaktan kaçınmak için "sadece" yapabilirsiniz .
lorenzog

7

Bulduğum en hızlı yöntem PS konsolunda aşağıdakileri çalıştırmak.

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

$ path yerel bir yol veya UNC paylaşımıdır.


2
Şuna bak. Geçerli bir cevap, soru sorulduktan neredeyse 7,5 yıl sonra ortaya çıktı!
p.campbell

Sayıyı 10 saniye içinde geri döndürmek için 2,1 milyondan fazla dosya içeren bir dizinde Sanal Sunucu üzerinde çalıştım. Bu kesin doğru cevap olmalı.
DarrenMB

Bu gerçekten en iyi cevap. 4.5 milyon dosyaya sahip bir klasörüm vardı ve bu yöntem birkaç saniye içinde onları saydı. Önerilen diğer cevaplardaki yöntemler onlardan vazgeçmeden önce birkaç dakika sürdü.
ripvlan

3

dir / B çıkışındaki satırları saymak (dizinler dahil):
dir /B | find /c /v "~~~"

sadece dosya saymak için (dir dir)
dir /A-D /B | find /c /v "~~~"


Bu, dosyaları ve dizin sayısını toplam olarak döndürür
TheCleaner

2

Bulunan bu net:

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

Test ettim ve işe yarıyor.


“Doğru görünüyor” buradaki doğru kelime. (1) Bu, her durumda birer kapalıdır, çünkü dirkomut, içinde dosya olmayan iki noktalı bir çizgi içerir . (2) Bu, mutlaka olması gerekmeyen bir kolonu içerecek zaman formatına dayanır. (3) Aynı şekilde olması gerekmeyen, iki nokta üst üste içermeyen sayı biçimine dayanır . Ayrıca, burada bir dosyadan geçmek gereksizdir ve yazma hakkınız yoksa kötü bir fikir olmazsa işe yaramaz.
Joey,

"NUMfiles. ###" dosyası oluşturmadan nasıl yapılır?
NickUnuchek

2

Sadece Trevoke'un PowerShell cevabını yukarıdakilere cevap verebilecek olanlar için bir uyarı ( Windows komut istemi: geçerli dizindeki tüm dosyaların sayımı nasıl alınır? ): Tasarım gereği, Get-ChildItem tarafından döndürülen bir koleksiyonun Count özelliğini yankılatarak yanıltıcı sonuçlar verebilir değer 1 veya 0 ise, bunun nedeni Count özelliğinin yalnızca dizilerde kullanılabilir olmasıdır. Get-ChildItem tarafından 2'den az öğe döndürülürse sonuç skaler olur ve .Count hiçbir şey döndürmez. Bunu aşmak için, açıkça bir diziye, örneğin, @ (Get-ChildItem C: \ Scripts) .Count.

Daha fazla bilgi için, http://connect.microsoft.com/PowerShell/feedback/details/354672/get-childitem-count-problem-with-one-file veya http://www.vistax64.com/powershell/266379 -get-childitem-say-değil-çalışma-bir-dosya.html .


0

dir altındaki dosya ve dizin sayısını döndürür


0

DIR tabii ki çalışacak

Sunucuya bir şey yüklemeden, ancak iş istasyonunuzda güç kaynağına sahip olmadan şunları yapabilirsiniz:

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

Bu komut size tüm dosyaları verecektir (sistem dahil ve gizli) ve powershell makinedeyse önceden belirtildiği gibi basitçe

(GCI c:\*.*).count

İçermiyorsanız, unutmayın . Tüm dosyaların ve tüm dizinlerin sayısını alırsınız. Hepsini saymak için -force eklemeniz gereken gizli ve sistem dosyalarını eklemeyeceksiniz


0

Sadece bir kez buna ihtiyacım olsaydı, sadece dir kullanırdım, aksi takdirde kendimi yuvarlamayı düşünürdüm, muhtemelen bir C # uygulaması olarak. Çünkü en çok aşina olacağım şeydi (VBScript ya da PowerShell de uygulanabilir).

(Bu arada - cmd.exe kullanıyorsanız DOS değil)


0

Dosya sayısını almak için özniteliği kullanabileceğinizi düşünüyorum:

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

Bu, geçerli dizindeki filecount.txt adlı bir dosya oluşturacak ve geçerli dizindeki dosya ve klasörlerin sayısını (yeni oluşturulan dosya dahil) oluşturacaktır. Değiştirebilirsiniz

*.*

için

<full_path>\*.*

Belirli bir dizinin dosya sayısını almak için. Klasörleri saymak istemiyorsanız "/ D" seçeneğini kaldırın. "/ S" seçeneği belirtilen klasördeki tüm dizinlerdeki dosyaları işler. Bu nedenle, yalnızca belirtilen yoldaki dosyaları istiyorsanız ve alt klasörlere dosya eklemek istemiyorsanız kaldırın.

Örneğin, C: \ sürücünüzde kaç tane dosya olduğunu bulmak istiyorsanız ve herhangi bir alt klasörde bulunmadığınızı öğrenmek için aşağıdaki komutu kullanın:

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

Sonuç olarak dosyaları kullanmak en akıllıca fikir değildir. Geçerli dizin sizin tarafınızdan yazılabilir değilse ne yaparsınız?
Joey,

@Johannes Yazma erişiminiz olan bir dizini kullanın? örneğin, çıktıyı C: \ MyWritableDir \ filecount.txt olarak aktarın
saat

Hala gereksiz.
Joey,

-2

Benzer bir şey yapıyorum ve bu anında herhangi bir sayıda dosyayla çalışır.

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.

Neden zaten çok sayıda (iyi) kulesi olan 6 yaşındaki bir soruya faydasız (ve kusurlu) bir cevap yolladım?
Massimo

@Massimo çünkü yukarıdaki cevaplardan memnun kalmadım ve daha şık bir çözüm istiyordum. Neden zamanla sınırlı olmayan bir bilginin peşinden koşuyorsun?
Aaron Lowe,

Urgh! Cevaplar korkunç görünüyor. Cevap içine çözüm düzenlendi. Bana teşekkür etmene gerek yok başkalarına yardım etmek için negatif temsilciliği seviyorum:
Aaron Lowe

Bazı çıktıları tutmak için geçici dosya kullanmak için hiçbir neden yoktur; Ayrıca, kullanmak findiyi bir fikir değildir. Detaylar için kabul edilen cevaba bakınız.
Massimo

@Massimo Sorunuzu cevapladım. Bana bir cevap borçlusun. Bana temp dosyasını kullanmaktan nasıl kaçınabileceğimi gösterebilirsen çok sevinirim. Ben zaten tüm cevapları okudum, bu yüzden kendime gönderdim. Bunun bir cevap kabul edildiğinden, yeni cevapların bulunamayacağını varsayıyorsunuz. Sadece OP için değil aynı çözümü arayan herkes için.
Aaron Lowe
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.