人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

正規表現を使ってファイル名を修正し、指定したフォルダ内に格納する方法を教示ください。
例えば、

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




●質問者: まさきん
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

質問者から

プラットホームはWindowsです。
シェルであればcygwinを使う想定です。


1 ● Mook
●150ポイント

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" ) }

2 ● siachan
●150ポイント ベストアンサー

f:id:siachan:20150628150111:image
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 ||<

siachanさんのコメント
そうなるとちょっとFlexible Renameを使った方法は思いつかないので、バッチファイルの方を修正しました。 あ、サブフォルダ内も検索対象にしてしまってるんですが、必要ないなら dir の後の /s は消して下さい。

質問者から

言葉足らずでした。すいません。
連番はフォルダ単位での連番を想定しています


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ