Windowsコマンドプロンプト:現在のディレクトリ内のすべてのファイルの数を取得する方法


24

cmd.exe現在のディレクトリにあるファイルの数を調べるには、どのコマンドを使用しますか?

ここにPowershellオプションはありますか?

更新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 ":"

    これは、ユーザーのロケールについていくつかのことを想定していますが、そのすべてが真であることが保証されているわけではなく(問題の詳細をコメントとして残しています)、1つの結果を返しすぎます。

一般的に、あなたが使用したいfindの上にdir /b離れて、すべての非ファイル名のものをカットし、道というfencepostエラーを回避します。

したがって、エレガントなバリアントは次のようになります。

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

最初にすべてのファイル名を1行ずつ出力します。そして、その出力の空でない行をすべてカウントします。ファイル名を空にすることはできないので(何かが足りない場合を除き、Unicodeは私のテストではこれをトリップしません)。


1
+1それはまさに私が探していたものでした。JRありがとう!
p.campbell

最初のバージョンをすべて1行にするための微調整:(set count = 0&for%x in(*)do @(set / a count + = 1> nul))&& echo%count%
ジェイソンマッセイ

+1dir /b /a-d | find /c /v ""
Arvo Bowen

数百万のファイルがある場合、このソリューションはうまく機能しません。「永久に」実行されます-PSと[System.IO.Directory] ​​:: GetFiles($ path).Countを使用して「数秒で」実行されるより良いソリューションが以下に投稿されます
ripvlan

@jason、%count%解析時に展開されるため、おそらく失敗します。
ジョーイ

17

AskとYeは以下を受け取ります: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を呼び出すときにフィルターを含めることができます。C:\ Scriptsフォルダーにある.PS1ファイルの数を知る必要がありますか?オーケードーク:

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

参考までに..「powershell count files」をグーグル検索しました。


1
あなたは、カウントが実際に第二の例に従って、ファイルを数えるようにするファイル指定を追加する必要があります
ジム・B

3
明確にするため(Get-ChildItem C:\ Scripts)。Countはフォルダー内のファイルの数を返さず、フォルダー内のOBJECTSの数を返します。ファイルをカウントするには、フィルターまたはファイル仕様を追加する必要があります。あなたのCのルートから(GCI).countとdirを試してみてください。数の差でドライブと表情
ジム・B

4
同じリンクから、サブフォルダー内のファイルもカウントする場合は、次を使用します(Get-ChildItem -recurse -filter "*.ps1").Count
。– jrsconfitto

1
ファイルが1つしかない場合は機能しません。$ filecount = @(get-childitem $ directory -filter " ").Countのようにする必要があります。私が他の場所で読んだものから、1つのファイルがある場合、それは配列ではありません。
NealWalters

@NealWalters:これはPowerShell v3までは正しかった。それ以降は問題ではありません。
ジョーイ

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

このような単純なファイル操作にPowerShellを使用することに関する警告の言葉-特にネットワーク接続やディレクトリに数千のファイルがある場合、cmd.exeに比べて信じられないほど遅いです。詳細については、このフォーラムの投稿を参照してください。


システムが英語とは異なる言語を使用している場合、これに問題が発生します。
WalyKu

7

dir 下部に合計ファイル数が表示されます。


1
1仲間、あなたは私にこれに勝った:)
dyasny

2
そして、すべての行がcmdウィンドウをスクロールするのを見るコストを避けるために...それを最小化すると、LOTがより速く動作します。
gbjbaanb

1
またはただdir > file..ああ、POSIXが恋しい
ロレンツォグ

1
@lorenz:dir > fileWindowsで動作しない理由は何ですか?出力のリダイレクトはまったく魔法ではありません。
ジョーイ

1
@johannes:実際に動作します!POSIXが恋しいのdir | grep (something)は、画面上での書き込みが遅くなる(そして、それを完全に最小化する)ことを避けるために「ちょうど」できるからです。
ロレンツォグ

7

私が見つけた最速の方法は、PSコンソールで次を実行することです。

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

$ pathはローカルパスまたはUNC共有です。


2
あれ見てよ。有効な素晴らしい答えは、質問が行われたほぼ7.5年後に現れました!
p.campbell

210万を超えるファイルがあるディレクトリ内の仮想サーバーで作業して、約10秒でカウントを返しました。これは確かに正しい答えであるはずです。
DarrenMB

これは本当に最高の答えです。450万のファイルが入ったフォルダーがあり、この方法では数秒でそれらをカウントしました。私がそれらをあきらめる前に、他の提案された答えの方法は数分間実行されました。
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コマンドにはファイルではないコロンが含まれる行が含まれているため、これはどのような場合でも1つずれています。(2)これはコロンを含む時間形式に依存しますが、コロンは必ずしもそうである必要はありません。(3)コロンを含まない数値形式に依存します。コロンは必ずしもそうである必要はありません。また、ここでファイルを調べることは不要であり、書き込みアクセス権がないと機能しません。これは悪い考えです。
ジョーイ

ファイル "NUMfiles。###"を作成せずに作成する方法は?
-NickUnuchek

2

上記のTrevokeのPowerShellの答えを使用する可能性のある人への注意点(Windowsコマンドプロンプト:現在のディレクトリ内のすべてのファイルの数を取得する方法?):設計により、Get-ChildItemによって返されるコレクションのCountプロパティをエコーすると、誤解を招く結果が生じる可能性があります値が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コマンドレットカウント-動作しない-1-file.html



0

DIrはもちろん動作します

サーバーに何かをインストールせずに、ワークステーションにPowerShellをインストールすることなく、次のことができます。

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

このコマンドは、すべてのファイル(システムと非表示を含む)を提供します。前述のように、powershellがマシン上にある場合は、単純に

(GCI c:\*.*).count

を含めない場合は注意してくださいすべてのファイルとすべてのディレクトリの数を取得します。すべてをカウントするために-forceを追加する必要がある隠しファイルとシステムファイルは含めません。


0

dirを使用するだけでこれが必要な場合は、おそらくC#アプリとして使用することをお勧めします(VBScriptまたはPowerShellも実行可能ですが)。

(ところで-cmd.exeを使用している場合はDOSではありません)


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にパイプします
-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はお勧めできません。詳細については、受け入れられた回答を参照してください。
マッシモ

@マシモあなたの質問に答えました。あなたは私の答えを借りている。一時ファイルの使用を避ける方法を教えていただければ幸いです。私はすでにすべての答えを読んだので、自分の答えを投稿しました。回答が受け入れられたため、新しい回答が見つからないと想定しています。OPだけでなく、同じソリューションを探しているすべての人のためです。
アーロンロウ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.