001         package com.croftsoft.apps.rename;
002    
003         import java.io.*;
004         import java.util.*;
005    
006         /*********************************************************************
007         * Renames files in a directory.
008         *
009         * <P>
010         *
011         * @version
012         *   2000-05-09
013         * @author
014         *   <A HREF="http://www.alumni.caltech.edu/~croft/">David W. Croft</A>
015         *********************************************************************/
016    
017         public class  Rename implements FilenameFilter
018         //////////////////////////////////////////////////////////////////////
019         //////////////////////////////////////////////////////////////////////
020         {
021    
022         private final String  oldNameTemplate;
023    
024         private final String  pre;
025    
026         private final String  post;
027    
028         //////////////////////////////////////////////////////////////////////
029         //////////////////////////////////////////////////////////////////////
030    
031         public static void  main ( String [ ]  args ) throws Exception
032         //////////////////////////////////////////////////////////////////////
033         {
034           rename ( new File ( "." ), args [ 0 ], args [ 1 ] );
035         }
036    
037         public static void  rename (
038           File    directory,
039           String  oldNameTemplate,
040           String  newNameTemplate )
041         //////////////////////////////////////////////////////////////////////
042         {
043           if ( directory == null )
044           {
045             throw new IllegalArgumentException ( "null directory" );
046           }
047    
048           FilenameFilter  filenameFilter = new Rename ( oldNameTemplate );
049    
050           File [ ]  files = directory.listFiles ( filenameFilter );
051    
052           for ( int  i = 0; i < files.length; i++ )
053           {
054             String  oldName = files [ i ].getName ( );
055    
056             File  newFile = new File ( directory,
057               toNewName ( oldName, oldNameTemplate, newNameTemplate ) );
058    
059             if ( !files [ i ].renameTo ( newFile ) )
060             {
061               throw new RuntimeException ( "Failure renaming \""
062                 + files [ i ] + "\" to \"" + newFile + "\"" );
063             }
064           }      
065         }
066    
067         public static String  toNewName (
068           String  oldName,
069           String  oldNameTemplate,
070           String  newNameTemplate )
071         //////////////////////////////////////////////////////////////////////
072         {
073           String [ ]  oldParts = parseParts ( oldNameTemplate );
074    
075           String  value = oldName.substring ( oldParts [ 0 ].length ( ),
076             oldName.length ( ) - oldParts [ 1 ].length ( ) );
077    
078           String [ ]  newParts = parseParts ( newNameTemplate );
079    
080           return newParts [ 0 ] + value + newParts [ 1 ];
081         }
082    
083         //////////////////////////////////////////////////////////////////////
084         //////////////////////////////////////////////////////////////////////
085    
086         public  Rename (
087           String  oldNameTemplate )
088         //////////////////////////////////////////////////////////////////////
089         {
090           this.oldNameTemplate = oldNameTemplate;
091    
092           String [ ]  parts = parseParts ( oldNameTemplate );
093    
094           pre  = parts [ 0 ];
095    
096           post = parts [ 1 ];
097         }
098    
099         //////////////////////////////////////////////////////////////////////
100         //////////////////////////////////////////////////////////////////////
101    
102         public boolean  accept (
103           File    directory,
104           String  filename )
105         //////////////////////////////////////////////////////////////////////
106         {
107           return filename.startsWith ( pre  )
108             &&   filename.endsWith   ( post );
109         }
110    
111         //////////////////////////////////////////////////////////////////////
112         // private methods
113         //////////////////////////////////////////////////////////////////////
114    
115         private static String [ ]  parseParts ( String  filenameTemplate )
116         //////////////////////////////////////////////////////////////////////
117         {
118           int  index = filenameTemplate.indexOf ( '*' );
119    
120           if ( index < 0 )
121           {
122             throw new IllegalArgumentException (
123               "No wildcard character (*) in \"" + filenameTemplate + "\"" );
124           }
125    
126           String  pre = filenameTemplate.substring ( 0, index );
127    
128           String  post = filenameTemplate.substring ( index + 1 );
129    
130           return new String [ ] { pre, post };
131         }
132    
133         //////////////////////////////////////////////////////////////////////
134         //////////////////////////////////////////////////////////////////////
135         }