El programa minus.exe convierte a minúsculas los nombres de un fichero de un directorio (y, opcionalmente el de sus subdirectorios). A la vez, también convierte a minúsculas las referencias SRC=".." y HREF=".." que haya dentro de los ficheros .htm y .html dentro en ese directorio.

  Ejecutable: minus.exe Código fuente (Delphi): minus.dpr
 
program minus;

{$APPTYPE CONSOLE}

uses SysUtils;

var
  DirInicial: String;
  IncluirSubdirectorios: Boolean;

function ProcesarLinea(Clave, S: String): String;
var
  P, Q: Integer;
begin
  P := Pos(Clave, UpperCase(S));
  if P <> 0 then
    begin
      Q := P+ Length(Clave);
      P := Q;
      repeat
       Inc(P);
      until (Copy(S, P, 1) = '"') or (P >= Length(S));
      S := Copy(S, 1, Q-1) + LowerCase(Copy(S, Q, P-Q)) +
        Copy(S, P, Length(S));
    end;
  ProcesarLinea := S;
end;

procedure ProcesarFichero(Nombre: String);
var
  Fichero, Salida: TextFile;
  Linea: String;
begin
  Writeln(Nombre);
  Assign(Fichero, Nombre);
  Reset(Fichero);
  Assign(Salida, '~.~');
  Rewrite(Salida);
  while not Eof(Fichero) do
    begin
      Readln(Fichero, Linea);
      Linea := ProcesarLinea('HREF="', Linea);
      Linea := ProcesarLinea('SRC="', Linea);
      Writeln(Salida, Linea);
    end;
  Close(Fichero);
  Close(Salida);
  DeleteFile(Nombre);
  RenameFile('~.~', Nombre);
end;

function EsHTML(Nombre: String): Boolean;
var
  P: Integer;
  Extension: String;
begin
  P := Pos('.', Nombre);
  Extension := UpperCase(Copy(Nombre, P+1, Length(Nombre)));
  EsHTML := (Extension = 'HTM') or (Extension = 'HTML');
end;

procedure PonerRefsMinusculas(NombreDir: String);
var
  SR: TSearchRec;
  Resultado: Integer;
begin
  Resultado := FindFirst(NombreDir + '\*.*', faAnyFile, SR);
  while Resultado = 0 do
    begin
      if SR.Name[1] <> '.' then
        begin
          if SR.Attr and faDirectory <> 0 then
            begin
              if IncluirSubdirectorios then
                PonerRefsMinusculas(NombreDir + '\' + SR.Name);
            end
          else
            if EsHTML(SR.Name) then
              ProcesarFichero(NombreDir + '\' + SR.Name);
        end;
      Resultado := FindNext(SR);
    end;
end;

procedure PonerNombresMinusculas(NombreDir: String);
var
  Minusculas: String;
  SR: TSearchRec;
  Resultado: Integer;
begin
  Resultado := FindFirst(NombreDir + '\*.*', faAnyFile, SR);
  while Resultado = 0 do
    begin
      if SR.Name[1] <> '.' then
        begin
          Writeln(NombreDir + '\' + SR.Name);
          Minusculas := NombreDir + '\' + Lowercase(SR.Name);
          RenameFile(NombreDir + '\' + SR.Name, Minusculas);
          if ((SR.Attr and faDirectory) <> 0) and IncluirSubdirectorios then
            PonerNombresMinusculas(Minusculas);
        end;
      Resultado := FindNext(SR);
    end;
end;

begin
  GetDir(0, DirInicial);
  if DirInicial[Length(DirInicial)] = '\' then
    Delete(DirInicial, Length(DirInicial), 1);
  IncluirSubdirectorios := (ParamStr(1) = '/s') or
                           (ParamStr(1)='/S');
  PonerNombresMinusculas(DirInicial);
  PonerRefsMinusculas(DirInicial);
end.
 

Francisco Javier García Capitán, 2006.