• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:大量のファイルをbatファイルでフォルダ整理したい)

大量のファイルをbatファイルでフォルダ整理する方法

このQ&Aのポイント
  • バッチファイルを使って、大量のファイルをフォルダ整理する方法について質問します。フォルダごとに数百~2000ファイルが保存されており、ファイル名は番号で構成されています。100ファイルずつのサブフォルダに分けて整理したいのですが、うまくいかない状況です。バッチファイルを使ってこの整理作業を一気に行う方法を教えてください。
  • バッチファイルを使ったフォルダ整理について質問します。大量のファイルが格納されているフォルダを100ファイルずつのサブフォルダに分けて整理したいのですが、うまくいかない状況です。バッチファイルの使い方やコマンドに詳しくないため、教えていただけると助かります。
  • バッチファイルを使ったフォルダ整理の方法について質問します。大量のファイルが格納されているフォルダを100ファイルずつのサブフォルダに分けて整理したいのですが、うまくいかない状況です。バッチファイルの作成やコマンドの使い方について詳しい方、ご教示いただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.5

エラーになる件はdoの書き漏れでした。 余談ですが、文法エラーの場合は、pauseが実行されないので、BATファイルをダブルクリックするのじゃなくて、コマンドプロンプトからBATファイルを実行するとエラーの原因がわかります。 rem ファイルを順に処理する set N=0 for %%A in (*.txt) do ( set /a M=N%%100 if !M! == 0 ( if exist TMPDIR ren TMPDIR "!FIRST!-!LAST!" for /f %%B in ("%%~nA") do for /f "delims= " %%C in ("%%~B") do set FIRST=%%C md TMPDIR ) set /a N+=1 for /f %%B in ("%%~nA") do for /f "delims= " %%C in ("%%~B") do set LAST=%%C move "%%~A" TMPDIR ) if exist TMPDIR ren TMPDIR "!FIRST!-!LAST!" pause >「なお、delims= の後は全角空白です。」ここの意味もよく理解できておりません・・。 ファイル名が "1000000全角空白1000001.txt" の場合に、フォルダ名に使うのは空白の前の1000000にしたいだろうと思ってのことです。

okomari7
質問者

お礼

notnot様お世話になっております。 いだだいたコマンドで確認しましたところ、正に思い通りの動きをしてくれました!感動です! 私にもこのような技術があれば、3日も無駄にしなくて済んだのですが・・。 コマンドプロンプトからの実行についてもアドバイス感謝しつつ、ベストアンサーにさせていただきます。 本当にありがとうございました。

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.4

フォルダ名が数字の順とかにこだわらないのであれば、 (9999999のほうが10000000より後になるが) rem ファイルを順に処理する set N=0 for %%A in (*.txt) do ( set /a M=N%%100 if !M! == 0 ( if exist TMPDIR ren TMPDIR "!FIRST!-!LAST!" for /f %%B in ("%%~nA") do for /f "delims= " %%C in ("%%~B") set FIRST=%%C md TMPDIR ) set /a N+=1 for /f %%B in ("%%~nA") do for /f "delims= " %%C in ("%%~B") set LAST=%%C move "%%~A" TMPDIR ) if exist TMPDIR ren TMPDIR "!FIRST!-!LAST!" なお、delims= の後は全角空白です。

okomari7
質問者

補足

ご対応ありがとうございました。 桁の変わるタイミングはおおよそ把握できますので、(9999999のほうが10000000より後になるが)は手動での対応で処理できそうです。 頂いたプログラムの最初の行に @echo off setlocal enabledelayedexpansion pushd D:\okok\ 最後の行に pause を追加してテストしてみましたが、残念ながらうまく動きませんでした。 pauseが効かず、すぐにプロンプト画面が消えてしまいます。 条件によって、変更が必要な箇所があれば教えていただけませんでしょうか? 「なお、delims= の後は全角空白です。」ここの意味もよく理解できておりません・・。区切り文字として全角スペースを利用する? 本batがうまく動作できれば非常に助かります!

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

不規則なファイル名は処理しにくいので、ファイル名をリネームしましょう。 こんな感じでしょうか。 @echo off setlocal enabledelayedexpansion rem まずファイル名を整える rem 1.半角空白を含むファイル名から空白を削除 for %%A in ("* *") do ( set "A=%%~A" ren "%%~A" !A: =! ) rem 2.全角空白を含むファイル名から空白を削除 for %%A in ("* *") do ( set "A=%%~A" ren "%%~A" !A: =! ) rem 3.7桁のファイル名に先頭ゼロを付けて8桁にする for %%A in (???????.txt) do ren %%A 0%%A rem ファイルを順に処理する set N=0 for %%A in (*.txt) do ( set /a M=N%%100 if !M! == 0 ( if exist TMPDIR ren TMPDIR !FIRST!-!LAST! set FIRST=%%~nA md TMPDIR ) set /a N+=1 set LAST=%%~nA move %%A TMPDIR ) if exist TMPDIR ren TMPDIR !FIRST!-!LAST!

okomari7
質問者

補足

お助けいただき、ありがとうございます。 後出しで申し訳ないのですが、ファイル名が別のシステムにも登録されておりまして、検索時に必要となるため先頭への0追加や、その他リネーム処理が行えない状況です。 また、最初で述べた半角スペースありという条件も、「1000007 1000008 100009.txt」といった感じで、1ファイルで複数の番号に紐付されているものがあります。 いただいたbatの「rem ファイルを順に処理する」以下の部分だけをお借りして試してみたところ、ルールにそぐわないファイル名がある場合、そこでストップしてしまいましたが、ほとんどの場合はこの部分だけでも対応できそうですので、取り急ぎ頂いたbatで作業を開始できそうです。 可能であれば、ファイル名の桁数を無視して、単純に順番通り100ファイルずつ登録し、出来る限りのファイル名(複数Noがあるものは、最初の番号だけが利用される等)を付けてもらえれば、あとは手動で修正をかけるやり方でもかなり作業を簡素化できるのですが、、お手間を取らせてすみません、お時間ある時で構いませんので、よろしくお願いいたします。

  • aoyama984
  • ベストアンサー率45% (253/561)
回答No.2

フォルダは何階層ありますか 親フォルダの中に子フォルダのみでしょうか 孫フォルダやさらに下位のフォルダもありますか 100ファイル未満の場合はフォルダは作りますか 1090ファイルあるときは最後の90もフォルダを作りますが 90ファイルのみの場合は 処理する/しない

okomari7
質問者

お礼

ご検討いただきまして、ありがとうございました。

okomari7
質問者

補足

・階層的には2階層、「年度」(過去5年程度)→「月」(1月~12月)となっており、「年度」フォルダには「月」フォルダのみで、ファイルはありません。「月」フォルダの中に数百~2000程度のファイルがあります。 ・100ファイル未満の場合でもフォルダを作成し、最初と最後(昇順)のファイルの名を付けることができればうれしいです。 ・最後の90フォルダの場合もフォルダを作成し、フォルダ名はやはり最初と最後(昇順)のファイル名がつくと助かります。 よろしくお願いします。

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

ファイル名に規則性があればforで回せますが、無いようなので1ファイルずつコピーする必要があるでしょう。 問題は半角スペースの付いたファイルです。 copyコマンドはスペースが扱えなかったと思います。 これは手でファイル名を修正して整いたいです。 私ならExcelのような表計算ソフトを使ってbatchファイルを作ります。 copyはざっとコピーしてしまいます。 今のファイル名はdir >a.txtとしてファイル名一覧をテキストファイルにしてexcelに読ませ、ファイル名だけを抜き出して、先ほどのcopyの次の列にざっとコピーします。 次にコピー先はフォルダ名をざっと付け、ファイル名はxxxx00001 xxxx0002とかして数列を作る操作でざっと必要分作ります。 出来た内容をテキストファイルで出力し、拡張子をbatにして実行ですね。

okomari7
質問者

お礼

ご回答いただきましてありがとうございます。 エクセルによるbatファイル作成作業も検討したのですが、 全体としては複数階層で30万ファイル近くあり、エクセルの表を作成するだけでもかなりの作業となってしまうのです。 せめてフォルダ単位でbat処理(クリック)の作業が行えれば、劇的に効率があがるので汎用的な処理が可能なものを探しておりました。 いただいた回答は今後の参考にさせていただきます。 ありがとうございました。

関連するQ&A