Bulk rename files on media device matched with regex on Windows -


i feel on linux machine bash, don't have enough experience batch it.

basically, lot of music files on phone start track number :

01 - song 02 - song 03 third song (different format) 

i can of files regex match:

dir /b | findstr /i "^[0-9]+ .*" 

and i'm assuming should assign these values variable. can loop on them doing

for %filename in %var      ren file [something here] 

the thing have issues getting onto media device (how windows handle under hood?) , removing prefix, while dealing 2 possible formats (detecting '-' shouldn't hard). able sed, don't know batch equivalent.

i've been meaning while anyway.

there's handy perl rename script written years ago larry wall use rename files via regexp. since have need perl in windows, , installing perl 1 script seems waste, thought it'd idea rewrite prename using native windows scripting languages.

hopefully if there bugs, won't debilitating. didn't test script whole lot, seems work fine basic usage files you're renaming live in current working directory. bonus: backreferences work in replacement text. wooo.

example usage

prename.bat -v "s/searchrxp/replacement/flags" filemask 

see prename.bat -h in console window full usage help.

prename.bat

<!-- : prename.bat -- http://stackoverflow.com/a/38191137/1683264 @echo off & setlocal  rem // ensure flags , other vars begin undefined %%i in (v n f h show filemask search replace flags) set %%i=  rem // organize arguments /f "delims=" %%i in ('cscript //nologo //job:args "%~f0?.wsf" %*') set "%%~i" if defined h goto usage if defined invalid (     echo unrecognized option: %invalid%     goto usage ) if not defined filemask goto usage if not defined search goto usage if defined v set "show=1" if defined n set "show=1"  rem // expand wildcards %%i in (%filemask%) (     /f "delims=" %%# in ('cscript //nologo //job:newname "%~f0?.wsf" "%%~i"') (         if defined show echo %%~i -^> %%~#         if not defined n if not "%%~fi"=="%%~f#" (             >nul (                 if defined f (move /y "%%~i" "%%~#") else ren "%%~i" "%%~nx#"             )         )     ) )  goto :eof  :usage echo usage: %~nx0 [-v] [-n] [-f] perlexpr [filelist] echo    -v shows verbose output echo    -n performs simulation echo    -f forces overwriting existing files echo    perlexpr perl-compatible regular expression echo    filelist can contain wildcards echo; echo example: echo    %~nx0 -n "s/([^\.]+)$/\1.cmd/i" *.bat echo simulate renaming every .bat file extension .bat.cmd goto :eof  : end batch begin jscript hybrid code --> <package>     <job id="args">         <script language="jscript">             var args = {                     v: 0,                     n: 0,                     f: 0,                     h: 0,                     search: '',                     replace: '',                     flags: '',                     filemask: ''                 };              (var i=0; i<wsh.arguments.length; i++) {                 if (/^[\/-](.)/.test(wsh.arguments(i))) {                     if (typeof args[regexp.$1] === 'undefined')                         args.invalid = wsh.arguments(i);                     args[regexp.$1] = 1;                 }                 else if (/^s(\w)(.+)\1(.*)\1(.*)/.test(wsh.arguments(i))) {                     args.search = regexp.$2;                     args.replace = regexp.$3;                     args.flags = regexp.$4;                 }                 else args.filemask += ';' + '"' + wsh.arguments(i) + '"';             }             (var in args) if (args[i]) wsh.echo(i + '=' + args[i]);         </script>     </job>     <job id="newname">         <script language="jscript">             var env = wsh.createobject('wscript.shell').environment('process'),                 search = env('search'),                 repl = env('replace'),                 flags = env('flags');              wsh.echo(wsh.arguments(0).replace(                 new regexp(search, flags),                 function(full, $1, $2, $3, $4, $5, $6, $7, $8, $9) {                     var backref = [full, $1, $2, $3, $4, $5, $6, $7, $8, $9];                     return repl.replace(                         /[\\$](\d)/g,                         function(full, $1) { return backref[$1]; }                     );                 }             ));         </script>     </job> </package> 

Comments

Popular posts from this blog

java - Static nested class instance -

c# - Bluetooth LE CanUpdate Characteristic property -

JavaScript - Replace variable from string in all occurrences -