Umbenennen von wiederkehrenden Dokumenten

Neben dem Papier, welches man via Scanner erfasst, erhält man heute bereits einige Unterlagen direkt in digitaler Form, z.B. die Telefonrechnung oder die Stromrechnung.

Diese Dokumente würde ich als wiederkehrend bezeichnen, da sie in einem regelmäßigen Abstand auf dem Rechner landen. Leider folgen diese Dokumente meist nicht dem eigenen Format für Dateinamen. Wie bereits in Paperless Office beschrieben, habe ich mich für das Format YYYY-MM-DD – absender – beschreibung entschieden.

Daher ist für mich die erste Aufgabe, die Dateien einfach und wiederholbar umzubenennen (man kann es sicherlich jedes mal manuell machen, aber ich will dies ja alles etwas automatisieren, aber eben langsam Schritt für Schritt).

Da ich primär Java programmiere, verwende ich dies als Basis für alle Snippets, die ich im Zuge dieses Projekts anlege.
Ich definiere mir ein Pattern, als Beispiel dient hier ein Kontoauszug, von der ING DiBa (Beispiel Dateiname: Girokonto_350238442_Kontoauszug_20120212.pdf). Das zugehörige RegEx Pattern lautete:

private String pattern = 
  "Girokonto_350238442_Kontoauszug_(\\d{4})(\\d{2})(\\d{2}).pdf";

Wichtig ist hier der Teil in Klammern. Hier entnehmen wir für den neuen Namen, die Werte für das Jahr, den Monat und den Tag, denn das Ziel ist 2012-02-12 – ing diba – girokonto kontoauszug.pdf zu erhalten.

private String replaceWith = 
  "$1-$2-$3 - ing diba - girokonto kontoauszug.pdf";

Mit dem „$1“ bekommen wir, was im Pattern zwischen der ersten „()“ stand, also in dem Fall \\d{4} – mit dem Wert 2012.
Zusammengebaut könnten wir nun den Namen ändern, mittels

name.toString().replaceAll(pattern, replaceWith);

Wobei name in dem Fall vom Typ Path ist, welcher mit Java 7 eingeführt wurde.

Hier ein komplettes Beispiel Programm, welches exakt alle Kontoauszüge umbenennt, egal von welchem Datum.

import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;

public class RenameFiles {
  private Path rootPath;
  private String pattern = "Girokonto_350238442_Kontoauszug_(\\d{4})(\\d{2})(\\d{2}).pdf";
  private String replaceWith = "$1-$2-$3 - ing diba - girokonto kontoauszug.pdf";

  public RenameFiles() {
    rootPath = Paths.get(".");

    try {
      Finder finder = new Finder(pattern);
      Files.walkFileTree(rootPath, finder);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  class Finder extends SimpleFileVisitor {
    private final PathMatcher matcher;

    private Finder(String pattern) {
      // Hier wird der PathMatcher mit dem oben definierten Pattern
      // versehen. "regex:" definiert hier das Format des Pattern
      matcher = FileSystems.getDefault().getPathMatcher("regex:" + pattern);
    }

    private void find(Path file) {
      Path name = file.getFileName();
      if (name != null && matcher.matches(name)) {
        // Hier wird aus dem alten Namen, der neue
        String newName = name.toString().replaceAll(pattern, replaceWith);

        try {
          // mit move wird die bestehende Datei "verschoben", in dem Fall umbenannt
          Files.move(file, rootPath.resolve(newName));
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }

    public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {
      find(file);
      return FileVisitResult.CONTINUE;
    }
  }

  public static void main(String[] args) {
    new RenameFiles();
  }
}

Wenn man die Methode Files.walkFileTree auf das Root Verzeichnis legt, darf man sich nicht wundern wenn es etwas dauert und es ist vielleicht ratsam, zum Test erst mal eine System.out.println zu verwenden ;-).
Dies ist eine sehr einfache Implementierung, die man nun beliebig erweitern kann.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.