Групповое переименование на java

Появилась цель написать элементарную программу которая будет переименовывать файлы. Да-да таких, каких щас море. Но представим что у нас нет интернета чтоб скачать такую программку, но есть много энтузиазма.

Условия для програмки

  • На java(на баше это можно написать в пару строчек)
  • Консольная
  • Переименовывает файлы по заданной маске. Маска - символы, обязательно присутствующие в имени файла. Аналог как в shell, *mask*
  • Переименованные файлы должны быть вида fileNN.file, где NN заменяется на порядковый номер
  • Можно указать папку, но по умолчанию это текущая
  • Програма работает не рекурсивно

На написание програмки ушло минут 20, столько же на чтение документации. Из принципа писал не в ide, а в kwrite. Компилировал в консоли. Кстати, когда вы последний раз собирали программу руками? :)

Код:
[cc lang="java" lines="22"]
/**
* Renamer simple program
* @author ruX, http://ruX.pp.ru
*/

import java.io.*;
import java.util.*;

public class Renamer {
public static void main(String arg[]) {
switch (arg.length) {
case 2:
new Renamer(arg[0], arg[1], "./");
break;
case 3:
if (!arg[2].endsWith(File.separator)) arg[2] += File.separator;
new Renamer(arg[0], arg[1], arg[2]);
break;
default:
outHelp();
}
}

public static void outHelp() {
System.out.println("Renamer usage:");
System.out.println("\t java Renamer fileMask newFile path");
System.out.println("");
System.out.println("\t fileMask - file mask, such as 'php' ");
System.out.println("\t newFile - new file name. 'NN' replaces with number");
System.out.println("\t path - work path");
}

public List list(String fileMask, String path) {
List rez = new ArrayList();
String list[] = new File(path).list();
if (list != null)
for(String el : list)
if (el.contains(fileMask))
rez.add(el);
return rez;
}

public Renamer(String name, String newFileMask, String path) {
int i = 0, ok = 0, fail = 0;
for(Iterator it = list(name, path).iterator(); it.hasNext(); ) {
String fileName = path.concat(it.next());
String newFileName = path.concat(
newFileMask.replace("NN", Integer.toString(i++)));
System.out.println(fileName + " => " + newFileName);
try {
new File(fileName).renameTo(new File(newFileName));
ok++;
} catch (Exception ex) {
System.out.println("\tError rename: " + ex.toString());
}
}
System.out.println("");
System.out.println("Total " + ok + "/" + i + " files renamed");
}
}
[/cc]

Компилируем:
[cc lang="bash" line_numbers="false"]
# javac Renamer.java [/cc]

Пробуем запускать(для примера взял файлы скопировал файлы из /tmp. Можете взять откуда угодо. Файлы для переименования лежат в папке bla)
[cc lang="bash" line_numbers="false"]
# mkdir bla
# cp /tmp/*tmp* ./bla
# java Renamer "" bla@NN.tmp ./bla
./bla/nbbackup6351.tmp => ./bla/bla@0.tmp
./bla/dict_cache9807.tmp => ./bla/bla@1.tmp
./bla/nbbackup6353.tmp => ./bla/bla@2.tmp
...............
./bla/dict_cache9818.tmp => ./bla/bla@117.tmp
./bla/dict_cache20122.tmp => ./bla/bla@118.tmp

Total 119/119 files renamed
[/cc]
Вот так.
Первый аргумент программы - пустые ковычки, значит все файлы. С таким же успехом можно указать например medved - будут обработаны файлы содержащие medved, т.е. такие как ya_medved_boo

чуть чуть коментарий к программе:
метод main() - точка входа, в зависимости от аргументов коммандной строки создаёт экземпляр этого объекта, либо выводит справку
метод outHelp() - выводит справку.
конструктор Renamer() - переименовывает все файлы, лежащие в path, имеющие в имени файла строку name, в файл newFileMask
метод list() - возвращает список файлов имена которых содержат fileMask, находящиеся в папке path. Этот метод думаю вам пригодиться в своих разработках.