Windowsコマンドプロンプトからフルパスとファイルサイズのみを再帰的に表示するファイルを一覧表示する


50

特定のディレクトリおよびそのサブディレクトリ内のすべてのファイルのファイル名(フルパスを含む)とファイルサイズを含むテキストファイルを生成しようとしています(再帰的に)。理想的には、ファイルサイズにコンマが必要ないようにします(ただし、コンマで解決します!)

次のコマンドは、ファイルサイズなしで実行します。

dir /b /s /a:-D > results.txt

出力例は次のようになります。

C:\Users\Martin\Pictures\Table\original\PC120013.JPG  227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG  123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG  932344

私はこれをdir単独で使用することは不可能だと思いますが、間違っていることを証明したいと思います。コマンドプロンプトから使用可能なコマンドのみを使用して、これを行う別の方法はありますか?

回答:


28

これはそれを行う必要があります:

@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

あまり効率的ではありません...大量のファイルを含むフォルダーに対して実行するのは大雑把かもしれませんので、最初に小さなフォルダーで試してください。

「for /?」から ヘルプテキスト(「I」の代わりに「a」を使用しました)

In addition, substitution of FOR variable references has been enhanced.
You can now use the following optional syntax:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

The modifiers can be combined to get compound results:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

6
これを使用して小さな障害が発生しました。ファイル名にスペースが含まれるファイルは正しく登録されませんでした。これを修正するために、"tokens=*"次のように追加しました@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
ドンヴィンス

txtファイルに印刷する方法は?
Saeed Neamati

3
はずですfor /r %a in (*) do echo %~fa %~za
-ZAB

1
@Saeed Neamati-以下に例を示します>> C:\Temp\VideoList.txt-以前に行われたプロセスの結果はVideoListという名前のテキストファイルに書き出されます。1を使用して>(ファイルが上書きされますが既に存在する場合)と使用して>>末尾に新しい結果を追加する場合は、テキストファイル(それがすでに存在する場合)。テキストファイルがまだ存在しない場合、このコマンドは指定された名前で新しいファイルを書き込みます。
user23715

これは、テキストファイルに、私*の.dwgファイルのリスト、サンセリフファイルサイズを与えた:@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
CADのやつ

14

代替#1:FOR / Rは私にとって#2よりも直感的です。
代替#2:FOR / Fは、BrianAdkinsの提案の「名前のスペース」の問題を修正します。
代替方法3:パスが二重引用符で囲まれていることを除いて、FORFILESが私の選択です。

ブライアンや他の達人はもっと洗練された解決策を持っているかもしれませんし、他の多くの解決策を提案できるかもしれませんが、これらの3つは機能します。FOR TOKENSを使用しようとしましたが、ヘッダーとフッターを削除する必要があったため、#1に戻りました。また、小さな.batファイルを作成して呼び出すことを検討しましたが、別のファイルが追加されます(ただし、関数のように柔軟性が向上します)。

スペースを埋め込んだディレクトリとファイル名、200文字以上のファイル名、拡張子のないファイル名、小さなドライブのルートで、すべての選択肢をテストしました(ちょうど時間のために、ブライアンが示唆したように少し遅いですが) Windowsエクスプローラーで検索しているため、すべての検索アプリをインストールしました)。

代替#1:FOR / R

(?)ベストブライアンのソリューションは、私のために動作しなかった理由を把握しようと、私はのヘルプを見て/ Rのアプローチをとることに決めたものの。(ファイルの作成は、代替#2と同じです。)

@echo off & for /R "c:\deletelater\folder with spaces" %A in (*.*) do echo %~fA %~zA

例-動作(再帰を示すために上記とは異なるディレクトリ)

@echo off & for /R "c:\deletelater" %A in (*.*) do echo %~fA %~zA
c:\DeleteLater\Name with Spaces.txt 19800676
c:\DeleteLater\NoSpacesLongName.txt 21745440
c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

代替#2:FOR / F

BrianAdkinsの提案: @echo off & for /f %a in ('dir /s /b') do echo %~fa %~za

修正答えは次のとおりです。

@echo off & for /f "delims=*" %A in ('dir /s /b') do echo %~fA %~zA 

より完全なファイルへの抑制のディレクトリおよび出力(追加)との答えは次のとおりです。

@echo Results on %DATE% for %CD% >> YourDirFile.txt & echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA >> YourDirFile.txt

注:「delims = *」は、ファイル名に使用できない文字を指定します。
注:2番目のコマンドも、/ a:-dを介してディレクトリを抑制します。
注:誰かが異なる変数名を選択した場合に変数と変数パラメーターの区別を明確にするために、FOR変数名を大文字にしました。
注:OPがファイルへの出力を要求したため、笑顔のためだけにファイルに追加されました。

ECHOのステータスを実際に確認し、同様にリセットする必要があると思います。

問題-名前のスペース

ブライアンの提案するソリューションは、スペースを含むファイル名とフォルダー名を処理しません(少なくとも私のVista構成では)。

例-間違っています (区切り文字なし。OPごとにディレクトリを非表示にしますが、強調のためにファイル名の前後にサイズがあります)

切り捨てられた名前とサイズ(6つのファイルのうち4つが正しくありません):

@echo off & for /f %A in ('dir /s /b /a:-d') do echo %~zA %~fA %~zA
 C:\DeleteLater\Name
21745440 C:\DeleteLater\NoSpacesLongName.txt 21745440
 C:\DeleteLater\Folder
 C:\DeleteLater\Folder
 C:\DeleteLater\FolderNoSpaces\3rd
28726032 C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

例-修正 (画面への出力に注意してください、ファイルには追加されません)

@echo off & for /f "delims=*" %A in ('dir /s /b /a:-d') do echo %~fA %~zA
C:\DeleteLater\Name with Spaces.txt 19800676
C:\DeleteLater\NoSpacesLongName.txt 21745440
C:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt 28726032

代替#3:FORFILES (引用問題)

このソリューションは、FORFILESドキュメントの最後の2つの例(forfiles /?)から直接のものです。

FORFILES /S /M *.doc /C "cmd /c echo @fsize"
FORFILES /M *.txt /C "cmd /c if @isdir==FALSE notepad.exe @file"

これらの例を組み合わせてファイルに書き込むと、答えが得られます(ほぼ)。

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize" >>ForfilesOut.txt

出力ではパスが引用符で囲まれていることに注意してください。切り替えられる
かどうecho onecho offは関係ありません。
各ディレクトリを区切る空白行を追加すると、IFの簡単な拡張になります。

注意:マスク/m *.*を使用しても、拡張子のないファイルは返されません(例の最後のファイルなど)。

余談:これは、各ディレクトリにファイルを書き込み、そのディレクトリの内容のみを表示します
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"。OPが望んだものではなく、時には便利です。

例-動作します(ただし、引用符で囲まれたフルパスを使用)

forfiles /s  /c "cmd /c if @isdir==FALSE echo @path @fsize"

"c:\DeleteLater\Name with Spaces.txt" 19800676
"c:\DeleteLater\NoSpacesLongName.txt" 21745440
"c:\DeleteLater\Folder with Spaces\2nd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with Spaces\2ndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpaces\3rd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpaces\3rdNoSpacesLongName.txt" 28726032
"c:\DeleteLater\MoreFiles\A really really long file name that goes on and on 123456789 asdfghjkl zxcvnm qwertyuiop and still A really really long file name that goes on and on 123456789 qwertyuiop and still further roughly 225 characters by now.txt" 447
"c:\DeleteLater\MoreFiles\New Text Document no extension" 0

この例には、超長いファイル名と拡張子のないファイル名を持つ追加のディレクトリが含まれています。

問題:引用符で囲まれたパス

だから、OPの例ごとに不要な(?)引用符を削除し、代替#3:FORFILESを保存する簡単な方法はありますか?(修辞的な質問:引用は機能ですか、それとも欠陥ですか?)



1
powershell "dir | select name,length"

これは、OPの質問をごまかす可能性があります。ただし、この質問は、最新のWindowsベースのシステムにはもはや関係ありません。Dirエイリアスは、論理リンクの描画を支援するために使用されました。


2
これを試しました(Windows 7)。(20エントリのディレクトリで)実行に30秒以上かかり、サブディレクトリに降りませんでした。
スコット

:再帰がに変更してください持っている powershell "Get-ChildItem -Recurse| select name,length"
giorgiomugnaini

0

以下は、ネットワークドライブで多くのスペースを占有しているその他のビデオファイルを見つけ、その結果をローカルPCのテキストファイルに書き込むために使用したものです。

次の3つの理由から、やや遅い回答を投稿しています。一つは、簡潔な答えが好きです。2つ目は、この1行のスクリプトが、ネットワーク全体を含む複数の設定で機能したことです。3つ目は、BrianAdkinsの回答の下にあるDon Vinceの潜在的にあいまいなコメントごとに、トークンを使用すると、スペースを含むファイル名から問題を回避できます。

for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt

非常に長いファイルパス/ファイル名(数百文字)もエラーの原因になりますが、検索はそれらでハングしません。ただし、ターゲットのパスは完全には探索されていません。一度注意しておけば、このエラーを解消するために、フォルダー構造をより深く開始することで補正できます。

このページss64には、dirコマンドの使用に関する非常に優れたプレゼンテーションがあり、すべてのスイッチ、多くのスイッチの組み合わせをリストし、適切な構文のいくつかの有用な例を示しています。さまざまなStack Exchangeコミュニティほど包括的ではありませんが、コマンドライン/バッチスクリプトに慣れると、プレゼンテーションが明確になります。


0

次のコマンドでこれに到達しました。

(for /R "\path\to\directory\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"

結果:

D:\Users\Natasha>(for /R ".\" %A in (*.*) do echo %~fA %~zA) | findstr /v "echo"


D:\Users\Natasha\Flowers_ (12).jpg 118886

D:\Users\Natasha\SomeFolder\data.txt 1241

D:\Users\Natasha\SomeFolder\CS\Counter-Strike_1.6.exe 272645624

PSこれは、BillR(代替#1)による応答に基づいています。ただし、私の場合はでハングし@echo offます。


0

「du」コマンドは非常に役立ち、WindowsとUnixの両方で動作します(Windows PCからLinux Webサーバーに大量のデータを転送するときにすべてのファイルがコピーされたかどうかを確認するために使用します)。

du -ah "C:\your_dir" > "C:\file_list.txt"

出力:

15  C:\your_dir/.htaccess
608 C:\your_dir/folder/hello.txt
1.0 C:\your_dir/folder/subfolder/test.txt
1.0 C:\your_dir/folder/subfolder
1.2M    C:\your_dir/folder/world.txt
1.2M    C:\your_dir/folder
9.0 C:\your_dir/no_file_ending
11  C:\your_dir/sample document 1.txt
684K    C:\your_dir/sample document 2 - äöüßÄÖÜáà.txt
1.9M    C:\your_dir

ただし、Notepad ++ではなく、Notepadで特殊文字しか正しく表示できませんでした(ANSI / UTF-8エンコーディングのものである必要があり、今すぐ正確に分析する時間はありません)。また、ファイル名の後にサイズを表示する解決策が見つかりませんでした。サイズをバイトまたはキロバイトで表示するには、「h」の代わりに「b」または「k」オプションを使用します。分析したいフォルダーの外でコマンドを実行するときに問題が発生しました。したがって、最良の方法は、正しいディレクトリ(この例では「C:\ your_dir」)にコマンドを入力し、コマンドで指定することです。


-1

dir / b / s / a:-D> results.txtのbを省略すると、結果は次のようになります(つまり、dir / s / a:-D> results.txt)。

ドライブHのボリュームはFILESボリュームシリアル番号はC9EB-112Eです

H:\ Filesのディレクトリ

09/29/2014 11:36 PM 0 testing.txt 1ファイル0バイト

H:\ Video \ Action \ Comixのディレクトリ

10/06/2012 09:51 AM
184,740 file1.txt 07/20/2012 06:21 AM 864,832 file2.txt 08/31/2009 08:47 PM 606,638 file3.txt 08/31/2009 09:07 PM 160,320 file4 。txt


これは元の質問に対する答えではありません。OPが要求した出力は生成されません。
DavidPostill

-1
where * /t  

過度に複雑になることなく、これにより目的の出力が生成されます。OPが要求したよりも少し多くなりますが、言及する価値があると思いました。/ Rスイッチを追加して、現在以外のディレクトリを指定します。


1
私が試みたように回答の更新と確認を検討し、エラーメッセージが表示されるERROR: Invalid syntax. Value expected for '/r'ので、図面に戻って正しい構文を提供し、正しい詳細で回答を編集してください。
ポン引きジュースIT

値を入力することを検討してください... / Rはディレクトリスイッチで、省略した場合はデフォルトで現在のディレクトリになります。
誰か

「OPが要求した以上のことをします」。冗談ですか?  where /?「デフォルトでは、検索は現在のディレクトリとPATH環境変数で指定されたパスで行われます” — where * /tコマンドは、のすべてのファイルC:\Windows\System32、のサブディレクトリC:\Program Files、およびのその他すべてのディレクトリをリストしますPATH。私にとっては、3000行以上でした。回答を編集して合理的なものにすることを検討してください。PSなし  /Rでは、再帰的ではありません。
スコット

WHERE / R。*。*私のために働いた。/ R。指定された場所(この場合は現在のディレクトリ)から再帰的に検索するように指示します。*。*は一致するパターンです。WHERE / R%USERPROFILE%* .docxは、ユーザーのフォルダー内のすべての単語ファイルを表示します。(これらのコメントで\を使用して*をエスケープする必要があります)
DHW
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.