例えば、
Flexible Renamerの詳細情報 : Vector ソフトを探す!
http://www.vector.co.jp/soft/winnt/util/se131133.html
のようなソフトで実現できれば良いですが、
難しい場合にはshもしくはbatで実現する方法を教えて下さい。
【対象ファイル名】
XXXXXX(数字6桁)_sub3.jpg
G15H-37-XXXXXX(数字6桁)-65A.JPG
上記の2パターン
【格納フォルダ名】
/XXXXXX(数字6桁)/連番.jpg
Flexible Renamerを使った方法ですが、検索の欄に
^(?:(\d{6})_sub3|G15H-37-(\d{6})-65A)\.jpg
と入力し、置換の欄に
.\\\1\2\\???.jpg
と入力します。ここでは連番を三桁としたので ??? にしましたが、四桁なら ???? にします。
あとは実行する動作を「別フォルダに移動&リネーム」にして「移動」ボタンを押すと移動先のルートフォルダを聞いてくるので選択するだけです。
ちなみに、はっきり言って実用的ではありませんが、バッチファイルだとこんな感じでしょうか。
@echo off SETLOCAL ENABLEDELAYEDEXPANSION for /f %%F in ('dir/b/s *.jpg^|findstr/i ^^G15H-37-[0-9]*-65A\.jpg') do ( echo %%F set FILE=%%F set NUM=!FILE:~-14,6! if not exist .\!NUM!\nul md !NUM! set COUNT=1 for %%C in (.\!NUM!\*.jpg) do set /a COUNT=COUNT+1 move %%F .\!NUM!\!COUNT!.jpg ) for /f %%F in ('dir/b/s *.jpg^|findstr/i ^^[0-9]*_sub3\.jpg') do ( echo %%F set FILE=%%F set NUM=!FILE:~-15,6! if not exist .\!NUM!\nul md !NUM! set COUNT=1 for %%C in (.\!NUM!\*.jpg) do set /a COUNT=COUNT+1 move %%F .\!NUM!\!COUNT!.jpg ) ENDLOCAL
かなり無理矢理な感じがしますね。
BAT では正規表現が使えないので、VBS か PowerShell でどうでしょうか。
下記 VBS の例ですが、ファイルの移動かコピーか判別付かなかったので、コピーにしています。
Option Explicit Dim fso Set fso = CreateObject("Scripting.FileSystemObject") Dim cPath cPath = Replace(WScript.ScriptFullName,WScript.ScriptName,"") Dim pt, f, dPath, ret For Each f in fso.GetFolder(cPath).Files For Each pt In Array( "^(\d{6})_sub3.jpg", "^G15H-37-(\d{6})-65A.jpg" ) ret = RegExpTest( pt, f.Name) If ret <> -1 Then dPath = cPath & "\" & ret If fso.FolderExists( dPath ) = False Then fso.CreateFolder dPath fso.CopyFile f.Path, dPath & "\" & (fso.GetFolder(dPath).Files.Count + 1) & ".jpg" End If Next Next '// 正規表現でチェック Function RegExpTest(patrn, strng) Dim regEx, Match Set regEx = New RegExp regEx.Pattern = patrn regEx.IgnoreCase = True regEx.Global = True If regEx.Test(strng) Then Set Match = regEx.Execute(strng) RegExpTest = Match.Item(0).SubMatches(0) Else RegExpTest = -1 End If End Function
PowerShell であればこんな感じで(シンタックス・ハイライトに PowerShell がない…)。
Get-ChildItem "D:\Data" | Where { $_ -match "^\d{6}_sub3.jpg" -or $_ -match "^G15H-37-\d{6}-65A.JPG"} | %{ if( $_ -match "^\d{6}_sub3.jpg" ) { $sp = 0 } else { $sp = 8 } $numFolder = ($_.DirectoryName + "\" + [string]($_.Name).Substring($sp,6)) If ( ( Test-Path $numFolder -PathType Container ) -eq $False ) { New-Item $numFolder -Type directory } Copy-Item -Path $_.FullName -Destination ($numFolder + "\" + ( (Get-ChildItem $numFolder | Measure-Object).Count + 1 )+ ".jpg" ) }
Flexible Renamerを使った方法ですが、検索の欄に
^(?:(\d{6})_sub3|G15H-37-(\d{6})-65A)\.jpg
と入力し、置換の欄に
.\\\1\2\\???.jpg
と入力します。ここでは連番を三桁としたので ??? にしましたが、四桁なら ???? にします。
あとは実行する動作を「別フォルダに移動&リネーム」にして「移動」ボタンを押すと移動先のルートフォルダを聞いてくるので選択するだけです。
ちなみに、はっきり言って実用的ではありませんが、バッチファイルだとこんな感じでしょうか。
@echo off SETLOCAL ENABLEDELAYEDEXPANSION for /f %%F in ('dir/b/s *.jpg^|findstr/i ^^G15H-37-[0-9]*-65A\.jpg') do ( echo %%F set FILE=%%F set NUM=!FILE:~-14,6! if not exist .\!NUM!\nul md !NUM! set COUNT=1 for %%C in (.\!NUM!\*.jpg) do set /a COUNT=COUNT+1 move %%F .\!NUM!\!COUNT!.jpg ) for /f %%F in ('dir/b/s *.jpg^|findstr/i ^^[0-9]*_sub3\.jpg') do ( echo %%F set FILE=%%F set NUM=!FILE:~-15,6! if not exist .\!NUM!\nul md !NUM! set COUNT=1 for %%C in (.\!NUM!\*.jpg) do set /a COUNT=COUNT+1 move %%F .\!NUM!\!COUNT!.jpg ) ENDLOCAL
かなり無理矢理な感じがしますね。
Flexible Renamerを使った方法は、ほぼ同じものを私も思いついたのですが、「連番」が全体の通し番号になってしまうので、質問者さんの期待と違うのではないかと思いました。
No.1の回答のように、コピー先の各フォルダ毎の通し番号を期待しているのではないかと思ったのですが、どちらを期待しているのですかね。
^(?:(\d{6})_sub3|G15H-37-(\d{6})-65A)\.jpg$
\1\2/?.jpg
そうなるとちょっとFlexible Renameを使った方法は思いつかないので、バッチファイルの方を修正しました。
あ、サブフォルダ内も検索対象にしてしまってるんですが、必要ないなら dir の後の /s は消して下さい。
Flexible Renamerを使った方法は、ほぼ同じものを私も思いついたのですが、「連番」が全体の通し番号になってしまうので、質問者さんの期待と違うのではないかと思いました。
2015/06/28 17:18:32No.1の回答のように、コピー先の各フォルダ毎の通し番号を期待しているのではないかと思ったのですが、どちらを期待しているのですかね。
そうなるとちょっとFlexible Renameを使った方法は思いつかないので、バッチファイルの方を修正しました。
2015/06/28 18:09:26あ、サブフォルダ内も検索対象にしてしまってるんですが、必要ないなら dir の後の /s は消して下さい。