web-dev-qa-db-ja.com

コマンドプロンプトで再帰的に裸のファイル名を取得する

ファイル名のみ(拡張子やファイルパスではない)を再帰的に取得しようとする小さな障害に遭遇しました。これはルートフォルダーで私にとってはうまくいきました:

dir /b

しかし、再帰的にスキャンするために/ sを追加すると、不要なファイル名の前にファイルパスも取得しました。ディレクトリ内のすべてのサブフォルダーから裸のファイル名を取得する方法はありますか?

Windows 7 x64のIM PSまたはVBSではなく通常のコマンドプロンプトを使用したい

20
TMRW

次のコマンドを使用します。

dir /b /a /s
  • / b出力から日付とその他の詳細を取り除きます
  • / aファイル名のみを出力し、パスは出力しません
  • / sは、再帰的なディレクトリ一覧を有効にします

出力をファイルに保存する必要がある場合は、以下を使用できます。

dir /b /a /s >> list_of_names.txt

編集実際には、上記の解決策は元の質問の目標に達していません。私が質問から気付いたことの1つは、投稿が再帰的なリストを要求することです。他の回答には欠けているので、他の回答者の回答に「/ s」を追加するとうまくいくと思います

for /f %a in ('dir /b /s') do @echo %~na
16
Nik So

これを試して:

for /f "delims=" %a in ('dir /b /s') do @echo %~na

Forの動作とその動作の詳細については、for /?と入力してください

6
Multiverse IT
_for /r %i in (*) do @echo %~ni
_

または

_forfiles /s /c "cmd /c if @isdir==FALSE noquotes.bat @fname"
_

%PATH% のファイル_noquotes.bat_がこのコンテンツであると仮定します

_@echo %~1
_

/ rアプローチの説明

_for /r_は、現在のディレクトリを再帰的にウォークし(ディレクトリを指定できます_for /r drive:\path\_、現在のディレクトリが想定されます)、セット_(*)_で一致する各ファイルに対してdoで指定されたコマンドを実行します。セット_(.)_は、ディレクトリのみに一致します。 @echo%〜niこのコマンドは、プロンプトからそのまま機能します。あなたがそれをバッチファイルの中に置くならば、あなたの引用を倍増してください。つまり、for /r %%i in (*) do @echo %%~ni

forfilesアプローチの説明

_/s_は、現在およびすべてのサブディレクトリを列挙します
_/c_引用符内のコマンドを実行します
_@isdir_および_@fname_は、コマンド文字列に出力されるシンボルです
追加のバッチファイル_noquotes.bat_は、二重引用符を%〜1(パラメーター1)で取り除くことで役立ちます
forfilesでは、_forfiles /P C:\Windows ..._で始まるパスを指定することもできます

2
JJS