質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.33%
コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

Q&A

1回答

285閲覧

forfilesを使用した、数字名のフォルダ検索方法

carpunkeiba

総合スコア0

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

0グッド

0クリップ

投稿2025/02/05 01:45

実現したいこと

forfilesコマンドを使用して、あるフォルダ内にある数字名のフォルダのみをzip圧縮したいと考えております。
前段として数字フォルダのみを検索対象として表示させようとしています。

発生している問題・分からないこと

ひとまず以下ディレクトリに対して、コマンドで検索してみたのですが、うまく意図した検索結果が得られません。
(想定としては20250128,20250129,20250130のみ表示させたい)
数字名のフォルダの指定の個所が誤っていると思われるのですが、数字名フォルダを検索する方法をご教示いただきたく、よろしくお願いします。

階層(TESTFOLDER下は全てフォルダです)
D:\TESTFOLDER
|_20250128
|_20250129
|_20250130
|_MMM
|_YYY

実行したコマンド①

forfiles /P "D:\TESTFOLDER" /M "[0-9]+" /C "cmd /c if @isdir==TRUE echo @path"
結果
エラー: 種類が "[0-9]+" のファイルが見つかりません。

実行したコマンド②
forfiles /P "D:\TESTFOLDER" /M "*" /C "cmd /c if @isdir==TRUE if @fname==[0-9]+ echo @path"
結果
検索しているようだが、何も表示されずにコマンド終了(@fnameでも@fileでも結果は同様)

実行したコマンド③(対象ディレクトリのフォルダは認識はされていることの確認)
forfiles /P "D:\TESTFOLDER" /M "*" /C "cmd /c if @isdir==TRUE echo @path"
結果
TESTFOLDER下のフォルダがすべて表示される
|_20250128
|_20250129
|_20250130
|_MMM
|_YYY

該当のソースコード

特になし

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ネット上では同様の質問は見つけられませんでした。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2025/02/05 02:17 編集

> 実行したコマンド① ===== forfiles | Microsoft Learn https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/forfiles /M <searchmask> 指定された検索マスクに従ってファイルを検索します。 既定の検索マスクは * です。 ===== /M オプションで指定できるのは正規表現(ERE や BRE)ではなく、ワイルドカード(wildcard)です。 * 任意の長さの文字(0文字以上) ? 任意の1文字(0文字も可) なので、"+" や "-", "[" や "]" という文字はそのままで扱われます。そのために、 > エラー: 種類が "[0-9]+" のファイルが見つかりません。 というエラーになってしまうわけです。
carpunkeiba

2025/02/05 05:11

>melianさん ご回答ありがとうございます。 おっしゃる通り、/Mのマスクに正規表現は使えないとは思っているのですが、 数字フォルダのみを検索対象とする方法はご存じでしょうか。
melian

2025/02/05 05:18

forfiles(コマンドプロンプト)を利用することは絶対的な条件なのでしょうか? そうでなければ PowerShell を使うことをお勧めします。
carpunkeiba

2025/02/05 08:50

できればコマンドプロンプトでforfilesを使いたいのですが。。。 ちなみにpowershellだとどのような記述になりますでしょうか。
melian

2025/02/05 09:20 編集

以下の様になります。 gci -Path "D:\TESTFOLDER" -Directory | ? { $_.Name -match '^\d+$' } | select Name
carpunkeiba

2025/02/06 00:27

ありがとうございます。 powershellでもできないか試してみます
guest

回答1

0

ディレクトリ構造がインデント無しになるので分かりません。こういうのはコードブロックに書くと良いです。
(質問入力欄の上の</>のアイコン)
指定フォルダー以下子孫まで全部見るという前提で回答します。

コメントにあるように、forfiles /mでは正規表現が使えないので、正規表現が使えるfindstrを使うと出来ます。
名前しか見ないので、forfilesを使う必要も無く、forで十分です。

ただし、findstrで使えるのは正規表現のサブセットなので、[0-9]+は使えず[0-9][0-9]*ですね。
(正規表現の何が使えるかは、findstr /?のヘルプに出てます)

CMD

1for /d /r "D:\TESTFOLDER" %%A in (*) do ( 2 echo %%~nxA | findstr /r /C:"^[0-9][0-9]* *$" >NUL 3 if not errorlevel 1 echo "%%~A" is OK 4)

forfilesの中で完結するのに比べると、ディレクトリー1つ毎にfindstrコマンドが動くので対象数が多いと時間が掛かると思いますが、圧縮するということなので、圧縮時間に比べれば誤差の範囲でしょう。

別解としては、「ディレクトリー名から0 1 ・・・9の文字を全部削除して空になれば、元は数字だけだった」という判断にすれば、CMD.EXE組み込み機能だけで出来ますが、そこまでやる必要は無いかと思います。速いかどうかも実測しないと分からない。

正規表現部分についての補足

正規表現は普通には"^[0-9][0-9]*$"ですが、echoの後の|の前に空白があると、空白までechoされます。(echo直後の空白が2つ以上の場合も同様)
例えば、ディレクトリ名が20250101だと、findstrが受け取るのは20250101 と後ろに空白が付いているので、 *$にしてあります。
ただ、こうしちゃうと、もし、20250101 という空白付きの名前が実在してそれを除きたい場合は工夫が必要。
例えば、echo :%%~nxA: | findstr /r ":[0-9][0-9]*:" >NULとファイル名に使えない文字で囲む。

もちろん、今後貴方以外の人がこのコードをいじる可能性が無ければ|の前の空白を詰めておけば *の部分は不要です。後任のうっかりさんが「見やすくしよう」と空白を入れそうな気がしてならないだけです。

投稿2025/02/05 11:47

編集2025/02/05 11:53
otn

総合スコア86160

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

carpunkeiba

2025/02/06 00:25

>otnさん 詳細なご説明ありがとうございます。 頂いた内容で調べて試してみます。 再度質問させていただくことがあるかもしれませんが、その際はよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.33%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問