Freitag, 7. Februar 2014

Java Runtime.exec() in Kombination mit fdupes

Zum Pruefen meines Bilderordners auf dem NAS,  schreibe ich gerade ein JAVA Programm. Es soll alle Duplikate finden  und mir anzeigen, danach soll ich auswaehlen koennen welche geloescht werden koennen.

Unter Linux gibt es da ein tolles 'Tool' genannt fdupes. Damit lassen sich auf der Commandozeile ziemlich schnell Duplikate finden. Die Syntax ist ganz einfach:

fdupes -r <VerzeichnisInDemNachDuplikatenGesuchtWerdenSoll>

Auf der Kommandozeile funktioniert dies prima, aber aus dem Javaprogramm heraus ist es irgendwie nicht so trivial.

Ich versuchte
 // pfad aus gewaehltem Ordner in pt speichern
 pt =chooser.getSelectedFile().getAbsolutePath();
 p= Runtime.getRuntime().exec("fdupes -r " +  pt);

Dies funktioniert auch prima, aber sobald in diesem Pfad ein Leerzeichen auftaucht (beispielsweise "Dokumente und Einstellungen") lieferte es mir keine Duplikate zurueck. Und das obwohl ich ueber die Commandozeile fuer den selben Eintrag Duplikate angezeigt bekam.

Die Loesung ist eigentlich recht einfach, aber ich habe Ewigkeiten gebraucht um sie zu finden (google und stackoverflow sei dank). Deshalb zur Erinnerung ins Blog:

getRuntime().exec(string) gibt es auch als getRuntime.exec(string[])

Das bedeutet ich kann auch ein Array von Strings uebergeben. Wobei das erste Element der Befehl ist und die restlichen Elemente Paramter.

Also wird noch ein String-Array eingefuehrt -> pth[]
String pth [] ={"fdupes","-r",pt};
Dies bekommt die Elemente fdupes als Kommando , "-r" als ersten Parameter (rekursive Suche in allen Unterordnern) und schliesslich noch den absoluten Pfad in dem gesucht werden soll.
Nun kann die Sache so ausgefuehrt werden: 

p= Runtime.getRuntime().exec(pth);

Und siehe da, nun klappt es! :) Ich habe Feuer gemacht!