2013-10-03 12:50:47 +0000 2013-10-03 12:50:47 +0000
53
53

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

私は、特定のディレクトリとそのサブディレクトリのすべてのファイルのファイル名(フルパスを含む)とファイルサイズを含むテキストファイルを生成しようとしています(つまり再帰的に)。理想的には、ファイルサイズにカンマを入れたくないのですが(でも、カンマを入れることにします!)

以下のコマンドはこれを実行しますが、ファイルサイズは入れません:

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だけでは不可能だと思います。コマンドプロンプトから利用可能なコマンドのみを使用する他の方法はありますか?

回答 (9)

28
28
28
2013-10-03 13:44:16 +0000

これで大丈夫なはずです。

@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

0x1&

15
15
15
2013-10-03 23:34:41 +0000

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

Brianや他の達人はもっとエレガントな解決策を持っているかもしれませんし、他にもたくさんの解決策を提案してくれるかもしれませんが、この3つはうまくいきます。FOR TOKENSを使ってみましたが、ヘッダーとフッターを削除しなければならなかったので、#1に戻しました。また、小さな .bat ファイルを作成してそれを呼び出すことも考えましたが、それは別のファイルを追加することになります (関数と同様に、より柔軟性を提供しますが)。

ディレクトリとスペースを埋め込んだファイル名、200文字以上のファイル名、拡張子のないファイル名、小さなドライブのルート上ですべての代替案をテストしました(時間の都合上、Brianが提案したように少し時間がかかりますが、Windowsエクスプローラで検索するのもそうです。

代替案1: FOR /R

ベスト(?) Brianの解決策がうまくいかない理由を探っているうちに、HELP FORを見て、/Rの方法を試してみることにしました。(ファイルの作成は、選択肢2と同じです。 )

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

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

@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 Spacesnd Name with Spaces.txt 5805492
c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032

Alternative #2: FOR /F

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

A 修正された答えは次の通りです:

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

A ディレクトリを抑制してファイルに出力(追記)した、より完全な答えは次の通りです。

@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=*” は、ファイル名に許可されていない文字を指定しています。
Note: 2番目のコマンドは、/a:-d経由のディレクトリも抑制する。
Note: 誰かが異なる変数名を選択した場合に、変数と変数パラメータの区別を明確にするため、FOR変数名を大文字にした。
Note: OPがファイルへの出力を求めていたので、ただのお笑いのためにファイルに追加しました。

本当にECHOの状態を確認してリセットした方がいいのかな。

Issue - Spaces in Names

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

Example - Wrong(デリムなし。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\FolderNoSpacesrd
28726032 C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032

Example - Correct(Note output to screen, not appended to file)

@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 Spacesnd Name with Spaces.txt 5805492
C:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt 3870322
C:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt 27874695
C:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.txt 28726032

Alternative #3: FORFILES (Quote Issue)

この解決策は、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の些細な拡張である。

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

Aside .

Aside : 各ディレクトリのファイルを、そのディレクトリだけの内容で書き出します。
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt" OPが望んでいたものではありませんが、便利な場合もあります。

Example - Works (ただしフルパスを引用符で囲む)

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 Spacesnd Name with Spaces.txt" 5805492
"c:\DeleteLater\Folder with SpacesndNoSpacesLongName.txt" 3870322
"c:\DeleteLater\FolderNoSpacesrd Name with Spaces.txt" 27874695
"c:\DeleteLater\FolderNoSpacesrdNoSpacesLongName.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

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

**_Issue.

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

1
1
1
2018-03-23 18:47:14 +0000
powershell "dir | select name,length"

これはOPの質問をごまかしているかもしれません。しかし、最近のWindowsベースのシステムでは、この質問はもはや関係ありません。Dirのエイリアスは論理的なリンクを描くために使用されました。

1
1
1
2014-02-12 12:47:47 +0000

しかし、 sfk ユーティリティ を使えば、かなり簡潔にこれを実現できます。

sfk cwd +run -yes "sfk list -size -tab $qfile +toclip"

sfk fromclip > C:\_temp\sfk_list_output.txt

(私は sfkコマンドチェイニング を使ってこのアプローチを得ました)

0
0
0
2017-11-11 17:59:32 +0000

du “コマンドは非常に便利で、WindowsとUnixの両方で動作します(Windows PCからLinux Web Serverに大量のデータを転送する際に、すべてのファイルがコピーされているかどうかをチェックするために使用しました)。

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

ただし、特殊文字はメモ帳でしか正しく表示されず、メモ帳++では表示されませんでした(ANSI/UTF-8エンコーディングの何かがあるのでしょう、今は正確に解析する時間がありません)。また、ファイル名の後にサイズを表示する方法も見つかりませんでした。サイズをバイトやキロバイトで表示するには、"h "の代わりに "b "か "k "オプションを使ってください。解析したいフォルダの外でコマンドを実行するときに問題がありました。正しいディレクトリ(この例では "C:\your_dir")にコマンドを入力することと、コマンドの中で指定することの両方を行うと良いでしょう。

0
0
0
2016-07-14 00:19:25 +0000

以下は、私がネットワークドライブ上で場所を取りすぎているmiscのビデオファイルを見つけて、その結果をローカルPC上のテキストファイルに書き込むために使用したものです。

私自身のやや遅れた回答を投稿しているのは、3つの理由からです。一つは、簡潔な回答が好きなこと。2つ目は、この一行のスクリプトがネットワークを含む複数の設定で動作したこと。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
0
0
2017-01-12 13:48:02 +0000

私は以下のコマンドでこれに到達しました。

(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

P.S. これはBillRの回答(代替案#1)に基づいています。しかし、私の場合は@echo offでハングします。

-1
-1
-1
2014-09-30 03:41:04 +0000

dir /b /s /a:-D -D > results.txt の b を省略し、結果は次のようになるはずです(すなわち dir /s/a: -D > results.txt):

Volume in drive H is FILES Volume Serial Number is C9EB-112E

Directory of H:\Files

09/29/2014 11:36 PM 0 testing.txt 1 File(s) 0 bytes 0

Directory of H:\VideoActionComix

10/06/2012 09:51 AM 184

-1
-1
-1
2018-03-22 20:22:09 +0000
where * /t

0x1& 複雑になりすぎずに、これで望みの出力が得られるはずです。OPが求めていたものよりも少し多くの出力が得られますが、言及する価値はあると思いました。カレント以外のディレクトリを指定するために/Rスイッチを追加します。