大量のAAAA_000000.jpgのようなファイル。
フォルダ分けするは大変ですよね…
この状態を解決するのに便利だったのでメモがてら投稿しておきます。
さて、どういう状況かまずは整理してみましょう。
例えば、以下のようなファイルが大量に存在しているとします。
AAAA_000001.jpg
AAAA_000002.jpg
AAAA_000003.jpg
AAAA_000004.jpg
AAAA_000005.jpg
AAAA_000006.jpg
AAAA_000007.jpg ……
BBBB_000001.jpg
BBBB_000002.jpg
BBBB_000003.jpg
BBBB_000004.jpg
BBBB_000005.jpg
BBBB_000006.jpg
BBBB_000007.jpg ……
CCCC_000001.jpg
CCCC_000002.jpg
CCCC_000003.jpg
CCCC_000004.jpg
CCCC_000005.jpg
CCCC_000006.jpg
CCCC_000007.jpg ……
以下省略
このような場合、皆さんならどうしますか?
まずフォルダを作成して、手作業で移動…したいですか?
連番であれば大量作成するサンプルもありますが、さらにファイルも移動…となるとなかなか良いサンプルスクリプトが見つかりません。
そんな時は、以下の内容でバッチファイルを作成し、目的のファイルが入っているフォルダへ保存します。
@echo off
pushd %~dp0
for /f %%i in (namelist.txt) do mkdir %%i
for /f %%j in (namelist.txt) do move "*%%j*" %%j
exit
簡単に解説しておくと以下の内容となっています。
@echo off
シェルスクリプト定番の「処理内容を表示しない」宣言です。
入力を要求しない場合は必須と思ってもらって構いません。
pushd %~dp0
通常、ディレクトリを移動するコマンドは「cd」を利用するかと思いますが、今回は「pushd」です。
このコマンドで、移動するディレクトリを一時的に記憶させられます。
オプションの「%~dp0」は「実行ファイルの置かれているディレクトリ」となります。
この一行で、「実行ファイルの置かれているディレクトリ」を「カレントディレクトリ」に指定するコマンドになります。
for /f %%i in (namelist.txt) do mkdir %%i
続いてはFor文です。
指定されたテキストファイルを読み込み、1行目から順番にその行に記載されている名前のディレクトリを作成するコマンドです。
ここまでの内容で保存すれば、リストからディレクトリだけ作成することも可能ですね。
for /f %%j in (namelist.txt) do move "*%%j*" %%j
続いてもFor文です。
前の行と同様、指定されたテキストファイルを読み込み、上から順番に処理しています。
前の行と異なるのは、命令文が「move」になっている点ですね。
一般的なmove文の解説は以下のとおりです。
move (option) [source file/directory] [target file/directory]
余談ですが、ターゲットがファイル名の場合はリネームしてしまいます…なぜ…
今回はリストから読み込んだ名前でディレクトリを作成していますので、ターゲットはディレクトリです。
move "*%%j*" %%j
ソースはワイルドカードを使用して、リストから読み込んだ文字列を含むファイルを指定しています。
ということで、各コマンドの解説が終了しました。
分類したいファイル( AAAA_000000.jpg )に含まれる文字列(AAAA)をまとめたリストをテキストファイルで作成します。
この時に、重複のないリストとして作成してください。
namelist.txtとして同じフォルダに保存します。
AAAA
BBBB
CCCC
リスト内に日本語(2バイト文字)が含まれる場合は、保存する際のエンコードをANSIにする必要があります。
ついうっかりUTF-8で保存すると、文字化けしたフォルダが作成され、対象のファイルは移動されません。
ここまで準備できたら、あとはバッチファイルを起動するだけでOK。
もうちょっと早く気づいていれば、作業時間が大幅に短縮できたのですが…
バッチファイルでどこまでできるのか、しっかり認識しておかないと駄目ですね。
コメント失礼します。作りたいバッチファイルがあるのですがご相談を受けてもらえますでしょうか?
コメントありがとうございます。
あまり詳しくはありませんが、それでもよろしければ。