Mini Jar-Programm

Mannimaker

Mitglied
Hallo zusammen,

weiß leider überhaupt nicht, ob ich hier richtig bin. Ich bräuchte Hilfe, vielleicht kann mir das auch jemand kurz "programmieren".

Ich benötige ein Jar Programm dass folgendes macht:

Verzeichnis mit Ordner (ohne Unteroder) umbenennen - diese sehen wie folgt auc:
Name,Name2,Name3 - ich möchte dass einfach alle Namen nach dem Beistrich in dieser Ebene entfernt werden und wenn ein anderer Ordner in diesem Verzeichnis bereits denselben Namen enthält - soll er den Ordner ersetzen und auch den Unterordern ersetzen, falls vorhanden :)

Und NEIN, das ist keine Hausaufgabe - ich benötige dass für mich Privat :) - wusste leider nicht, wo ich sonst mit meinem Thema hinkann - hätte sogar über CHATGPT probiert, mir so etwas schreiben zu lassen, aber selbst dann weiß ich nicht, wie ich das ein ein JAR-Programm bekomme :-/ ja, kenne mich da leider nicht wirklich aus.

Ist dies möglich und vor allem Verständlich ausgedrück? :)

Bitte um Info, danke Euch!

sg Mani
 

mihe7

Top Contributor
Du brauchst kein Jar, um ein Java-Programm auszuführen. Einfach java -cp . KlasseMitMainMethode aufrufen und schon läuft der Spaß. Mit neueren Java-Versionen musst Du ggf. noch nicht mal vorher kompilieren: java -cp . KlasseMitMainMethode.java. Der Dateiname muss mit dem Klassennamen beginnen und mit .java enden. Dazwischen hat nichts zu stehen. Das gilt ganz allgemein für öffentliche Klassen.

Java:
public class Test {
    public static void main(String[] args) {
        System.out.println("Hello world!");
    }
}
Abspeichern in eine Datei namens Test.java, dann in der Eingabeaufforderung:
Code:
cd \pfad\zum\verzeichnis\mit\quelltext
javac -cp . Test.java
java -cp . Test

Nachtrag: das ist nur eine ganz grobe "Anleitung". Wenn Du Pakete verwendest, musst Du beim Ausführen den vollqualifizierenden Klassennamen (inkl. Paket) angeben.
 

KonradN

Super-Moderator
Mitarbeiter
Hallo Mani,

erst einmal ist die Frage, ob Java hier das Mittel der Wahl ist und auch ob die Anforderung so die richtige ist. Eine ausführbare jar bringt halt einiges an Abhängigkeiten mit sich und so.

Ich habe das Umbenennen jetzt so nicht 100% verstanden, aber generell wäre es hier vermutlich einfacher, ein Shell (Linux, Max) oder PowerShell (Windows) Script zu schreiben, das dies dann macht.

Und man kann auch einfach schauen, ob es nicht ggf.- bereits fertige Tools gibt, die das eine oder andere schon können. So nutze ich unter Windows gerne den Total Commander, der sehr mächtig ist, was ein Massen-Umbenennen ist (unterstützt da auch reguläre Ausdrücke).

Das mit dem Verzeichnisse löschen könnte man einfach über einen Workflow lösen: Erst alle Ordner, die gelöscht werden könnten, verschieben. Dann das Umbenennen machen um dann im Anschluss die Order zurück zu schieben. Dabei alle überspringen, die schon da sind. Ganz am Ende würden dann alle Ordner gelöscht, die nicht verschoben worden sind.

Wenn Java Programm, dann würde ich es einfach als eine einzelne .java Datei implementieren, welche Du dann (aktuelles JDK vorausgesetzt) mit java MyRename.java oder so ausführen würdest.
 

Mannimaker

Mitglied
Hallo Mani,

erst einmal ist die Frage, ob Java hier das Mittel der Wahl ist und auch ob die Anforderung so die richtige ist. Eine ausführbare jar bringt halt einiges an Abhängigkeiten mit sich und so.

Ich habe das Umbenennen jetzt so nicht 100% verstanden, aber generell wäre es hier vermutlich einfacher, ein Shell (Linux, Max) oder PowerShell (Windows) Script zu schreiben, das dies dann macht.

Und man kann auch einfach schauen, ob es nicht ggf.- bereits fertige Tools gibt, die das eine oder andere schon können. So nutze ich unter Windows gerne den Total Commander, der sehr mächtig ist, was ein Massen-Umbenennen ist (unterstützt da auch reguläre Ausdrücke).

Das mit dem Verzeichnisse löschen könnte man einfach über einen Workflow lösen: Erst alle Ordner, die gelöscht werden könnten, verschieben. Dann das Umbenennen machen um dann im Anschluss die Order zurück zu schieben. Dabei alle überspringen, die schon da sind. Ganz am Ende würden dann alle Ordner gelöscht, die nicht verschoben worden sind.

Wenn Java Programm, dann würde ich es einfach als eine einzelne .java Datei implementieren, welche Du dann (aktuelles JDK vorausgesetzt) mit java MyRename.java oder so ausführen würdest.
Hallo KonradN,

danke zuerst einmal an mihe7 für die schnelle Antwort, dass ist mir aber leider etwas zu kompliziert, wie geschrieben, kenne mich leider nicht aus.

Nun zu KonradN,

Danke für deine Antwort, ich habe schon einmal von einem Praktikanten ein mini -Jar Programm bekommen - ich klicke drauf und es benennt mir Dateien um - Darum bin ich auch auf "JAR" gekommen - wie geschrieben, kenne mich leider garnicht aus.

Ich selbst benütze hier den "rename expert" der könnte auch fast mein Problem lösen, kommt aber damit nicht klar, dass in dem Verzeichnis -wenn er den Ordner umbenennt bereits ein anderer ist der so heißt - dabei würde ich mir nur wünschen, dass er halt dann den einen Ordner mit dem anderen zusammenfügt.

Nochmals erklärt: ich habe ein Verzeichnis - darin sind viele Ordner mit Namen: zB:

Haus
Haus,Baum
Haus,Baum,Straße

Ich möchte nun, dass er die Ordner mit dem Beistrich hernimmt - er den Beistrich und alles was danach kommt löscht und die 3 Ordner dann zum Beispiel zusammenfügt (und die dateien die sich in dem Ordner darunter befinden halt ersetzt (wenn gleich) oder neue ergänz.

Ich hoffe, es ist nun verständlich.

Wie geschrieben, ein Praktikant hat mir da mal ne super JAR geschrieben, die ich nur ausführen muss und die war sehr hilfreich (nachdem er da nicht so lange benötigt hat, dachte ich mir - dass ginge "einfach" :-/

Ich hoffe, es ist nun etwas verständlicher?

Danke.

lg Mani
 

Mannimaker

Mitglied
Hallo Mani,

erst einmal ist die Frage, ob Java hier das Mittel der Wahl ist und auch ob die Anforderung so die richtige ist. Eine ausführbare jar bringt halt einiges an Abhängigkeiten mit sich und so.

Ich habe das Umbenennen jetzt so nicht 100% verstanden, aber generell wäre es hier vermutlich einfacher, ein Shell (Linux, Max) oder PowerShell (Windows) Script zu schreiben, das dies dann macht.

Und man kann auch einfach schauen, ob es nicht ggf.- bereits fertige Tools gibt, die das eine oder andere schon können. So nutze ich unter Windows gerne den Total Commander, der sehr mächtig ist, was ein Massen-Umbenennen ist (unterstützt da auch reguläre Ausdrücke).

Das mit dem Verzeichnisse löschen könnte man einfach über einen Workflow lösen: Erst alle Ordner, die gelöscht werden könnten, verschieben. Dann das Umbenennen machen um dann im Anschluss die Order zurück zu schieben. Dabei alle überspringen, die schon da sind. Ganz am Ende würden dann alle Ordner gelöscht, die nicht verschoben worden sind.

Wenn Java Programm, dann würde ich es einfach als eine einzelne .java Datei implementieren, welche Du dann (aktuelles JDK vorausgesetzt) mit java MyRename.java oder so ausführen würdest.

CHATGPT würde mir folgendes Script für ne Bat oder ähnliches schreiben:

@echo off
setlocal enabledelayedexpansion

:: Bestimme den aktuellen Pfad des Skripts
for %%i in ("%~dp0.") do set "scriptpath=%%~fi"

:: Gehe in das Verzeichnis des Skripts
cd /d "%scriptpath%"

:: Bearbeite jeden Ordner in der ersten Ebene
for /d %%f in (*) do (
set "folder=%%f"
for /f "tokens=1* delims=," %%a in ("!folder!") do (
set "newfolder=%%a"
if not exist "!newfolder!" (
ren "!folder!" "!newfolder!"
) else (
move "!folder!"+"!newfolder!" "!newfolder!" /y
rd "!folder!" /s /q
)
)
)

endlocal


gerade gemerkt, da löscht er mir dann die anderen Ordner, hier hätte ich ja gerne, dass er sie zusammenführt :)

lg
 

mihe7

Top Contributor
Code:
@echo off
setlocal enabledelayedexpansion

REM Legen Sie das Verzeichnis fest, in dem sich die zu bearbeitenden Ordner befinden.
set "startDir=C:\Pfad\Zu\Ihren\Ordnern"

cd /d "%startDir%"

for /d %%A in (*) do (
    set "folderName=%%~nA"
    for /f "delims=," %%B in ("!folderName!") do (
        set "group=%%B"
        if not exist "!group!" (
            md "!group!"
        )
        move "%%A" "!group\"
    )
)

endlocal
 

KonradN

Super-Moderator
Mitarbeiter
Kannst du evtl etwas genauer erklären, was er genau machen soll? Bau mal ein Beispiel auf und sag genau, was er machen soll mit kurzer Regel Angabe.

Im Augenblick verstehe ich nicht, wann er etwas zusammen führen soll und wann er etwas löschen soll.
 

Mannimaker

Mitglied
Code:
@echo off
setlocal enabledelayedexpansion

REM Legen Sie das Verzeichnis fest, in dem sich die zu bearbeitenden Ordner befinden.
set "startDir=C:\Pfad\Zu\Ihren\Ordnern"

cd /d "%startDir%"

for /d %%A in (*) do (
    set "folderName=%%~nA"
    for /f "delims=," %%B in ("!folderName!") do (
        set "group=%%B"
        if not exist "!group!" (
            md "!group!"
        )
        move "%%A" "!group\"
    )
)

endlocal
Hallo Mihe, hat leider nicht funktioniert, danke trotzdem :)
lg Mani
 

Mannimaker

Mitglied
Kannst du evtl etwas genauer erklären, was er genau machen soll? Bau mal ein Beispiel auf und sag genau, was er machen soll mit kurzer Regel Angabe.

Im Augenblick verstehe ich nicht, wann er etwas zusammen führen soll und wann er etwas löschen soll.
ich habe ein Verzeichnis - darin sind viele Ordner mit Namen: zB:

Haus
Haus,Baum
Haus,Baum,Straße

DARUNTER befinden sich auch Ordner und darunter Dateien - die sollen nicht umgeschrieben werden.

Ich möchte, dass er in der ERSTEN Verzeichnisebene, die ORDNERNAMEN die einen Beistrich im Namen haben, verändert (ab dem ersten Beistrich von links soll er (inklusive dem Beistrich selbst) alle nach rechts löschen.

Wäre bei dem Beispiel dann:

Haus
Haus
Haus

diese drei Ordner soll er nun zusammenführen und die Unterordner darin behalten.

Also, ich mache einen Doppelklich auf die BAT und die führt diese Schritte aus.

alles nach dem Beistrich löschen (inkl. Beistrich) - gibt es keinen Beistrich in dem Ordnernamen, dann soll er ihn auch lassen.

Danach soll er die "GLEICHEN" Ordnernamen zusammenführen und alles was Ordner Ebenen darunter ist einfach übernehmen :)

Ich hoffe, man kennt sich jetzt aus :)

Danke.

lg Mani
 

KonradN

Super-Moderator
Mitarbeiter
Also wäre die Routine folgende:

- Für jeden Ordner (o) im Verzeichnis prüft man, ob der Name ein Trennzeichen (Im Beispiel das ",") enthält. Ist dies der Fall, dann wird gemacht:

a) Es wird ein Ordner (n) erzeugt, so dieser noch nicht vorhanden ist, mit dem Teilnamen bis zum ersten Trennzeichen
b) Der ganze Inhalt des Ordners (o) wird in den Ordner (n) verschoben
c) Der (nun leere) Ordner (o) wird gelöscht

Kann es überschneidungen kommen, also z.B.:
Haus/test.txt
Haus,Baum/test.txt
==> Zielordner ist "Haus" und es gibt "test.txt" zwei Mal. Das Verschieben schlägt somit fehl.

Der Punkt b) zum Verschieben wird also vermutlich noch angepasst werden müssen. Das Problem kann auch deutlich Komplexer sein, sobald es um Ordner geht:

Haus/a/test1.txt
Haus,Baum/a/test2.txt

a kollidiert, also ein Verschieben ist nicht möglich. Aber ein Zusammenführen ist möglich, da test1.txt und test2.txt ja nicht kollidieren....
 

KonradN

Super-Moderator
Mitarbeiter
Evtl. kurz zur Erläuterung: Das ist der übliche Entwicklungsprozess. Man beschreibt erst im Detail, was wann passieren soll. Das lässt sich dann später 1:1 in Code umsetzen. Was hier noch etwas fehlte ist die Zerteilung in Teilprobleme. Das erkennt man aber etwas, wenn man das bisher beschriebene etwas anders darstellt:

Bearbeite Ordner:
- Ordner enthält Trennzeichen? -> Ordner Umbenennen.

Ordner enthält Trennzeichen:
- Gibt zurück: Enthält der Name des Ordners ein ','?

Ordner Umbenennen:
- a) b) c) von oben etwas umgeschrieben ...

So ein Vorgehen sorgt dann am Ende zu einem Aufbau, der auch im Code sehr gut nachvollziehbar sein wird. Und Anpassungen sind sehr einfach. Wenn da ein Verschieben war, dann kann man diesen Unterpunkt gut anpassen ohne an irgend welchen anderen Stellen etwas anzupassen.

Das einfach nur als kurzer Hinweis zum Verständnis, wieso ich diese Schritte so gerade mache.
 

Mannimaker

Mitglied
Also wäre die Routine folgende:

- Für jeden Ordner (o) im Verzeichnis prüft man, ob der Name ein Trennzeichen (Im Beispiel das ",") enthält. Ist dies der Fall, dann wird gemacht:

a) Es wird ein Ordner (n) erzeugt, so dieser noch nicht vorhanden ist, mit dem Teilnamen bis zum ersten Trennzeichen
b) Der ganze Inhalt des Ordners (o) wird in den Ordner (n) verschoben
c) Der (nun leere) Ordner (o) wird gelöscht

Kann es überschneidungen kommen, also z.B.:
Haus/test.txt
Haus,Baum/test.txt
==> Zielordner ist "Haus" und es gibt "test.txt" zwei Mal. Das Verschieben schlägt somit fehl.

Der Punkt b) zum Verschieben wird also vermutlich noch angepasst werden müssen. Das Problem kann auch deutlich Komplexer sein, sobald es um Ordner geht:

Haus/a/test1.txt
Haus,Baum/a/test2.txt

a kollidiert, also ein Verschieben ist nicht möglich. Aber ein Zusammenführen ist möglich, da test1.txt und test2.txt ja nicht kollidieren....
Weis schon was du meinst, ein kollidieren wird es so nicht geben, die Ordner darunter sind meistens anders, sollten sie gleich sein möchte ich wie bei der ersten Ebene, dass er eben die Ordner integriert (so lautet ja der Wortlaut unter dem Windows Explorer).

Also er soll die Erste Ebene umschreiben und alles darunter "integrieren" sollte dann darunter mal eine Datei gleich lauten, darf er die gerne ersetzten :) weißt du wie ich meine :)

Arbeit ja selbst im User Support und weiß wie schwierig das Sender/Empfänger Prinzip ist :) leider bin ich halt kein Programmierer.

lg Mani
 

Mannimaker

Mitglied
Evtl. kurz zur Erläuterung: Das ist der übliche Entwicklungsprozess. Man beschreibt erst im Detail, was wann passieren soll. Das lässt sich dann später 1:1 in Code umsetzen. Was hier noch etwas fehlte ist die Zerteilung in Teilprobleme. Das erkennt man aber etwas, wenn man das bisher beschriebene etwas anders darstellt:

Bearbeite Ordner:
- Ordner enthält Trennzeichen? -> Ordner Umbenennen.

Ordner enthält Trennzeichen:
- Gibt zurück: Enthält der Name des Ordners ein ','?

Ordner Umbenennen:
- a) b) c) von oben etwas umgeschrieben ...

So ein Vorgehen sorgt dann am Ende zu einem Aufbau, der auch im Code sehr gut nachvollziehbar sein wird. Und Anpassungen sind sehr einfach. Wenn da ein Verschieben war, dann kann man diesen Unterpunkt gut anpassen ohne an irgend welchen anderen Stellen etwas anzupassen.

Das einfach nur als kurzer Hinweis zum Verständnis, wieso ich diese Schritte so gerade mache.
Das kann ich durchaus nachvollziehen - hier scheiterte es bestimmt an meiner Erklärung :)

Also ich möchte das wirklich nur auf erster Ebene umbenannt und alles darin und darunter integriert haben :)

Danke für dein Erklärung Konrad :)
lg Mani
 

KonradN

Super-Moderator
Mitarbeiter
Da ich jetzt leider weg muss kann ich es nicht fertig machen ... ich habe aber mal auf die Schnelle einfach etwas Code erstellt. Das Verschieben aller Elemente kommt von ChatGPT und das alles ist ungetestet. Aber evtl. ist es ja ein Anfang für jemand anderes oder wenn es Probleme gibt kann die jemand auf die Schnelle beheben ...

Java:
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;

public class MergeFiles {

    public static final String DIVIDER = ",";
    public static void main(String[] args) throws IOException {
        String folder;

        if (args.length == 1 )
            folder = args[0];
        else
            folder = new File(".").getAbsolutePath();

        renameFolder(folder);
    }

    private static void renameFolder(final String folderName) throws IOException {
        File folder = new File(folderName);
        if (!folder.exists() ||!folder.isDirectory()) {
            System.out.println("Folder " + folderName + " does not exist or not a folder");
        }

        for (File entry : folder.listFiles()) {
            System.out.print("Checking " + entry.getName());
            if (!entry.isDirectory()) {
                System.out.println(": not a directory!");
                continue;
            }

            if (!nameMatches(entry)) {
                System.out.println(": not matching name");
                continue;
            }

            System.out.println(": renaming!");
            handle(folder, entry.getName());
           
            // entry.delete();
        }
    }

    private static void handle(final File folder, final String name) throws IOException {
        String targetName = getTargetName(name);
        Path source = Path.of(folder.getAbsolutePath(), name);
        Path target = Path.of(folder.getAbsolutePath(), targetName);
        moveDirectory(source, target);
    }

    private static String getTargetName(final String name) {
        return name.substring(0, name.indexOf(DIVIDER));
    }

    private static boolean nameMatches(final File entry) {
        return entry.getName().contains(DIVIDER);
    }

    // Auf die Schnelle von ChatGPT erstellt
    public static void moveDirectory(Path source, Path target) throws IOException {
        if (!Files.isDirectory(source)) {
            throw new IllegalArgumentException("Source must be a directory.");
        }

        if (!Files.exists(target)) {
            Files.createDirectories(target);
        }

        Files.walkFileTree(source, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                Path targetDir = target.resolve(source.relativize(dir));
                if (!Files.exists(targetDir)) {
                    Files.createDirectory(targetDir);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Files.move(file, target.resolve(source.relativize(file)));
                return FileVisitResult.CONTINUE;
            }
        });
    }
}

Edit: Das delete ist auskommentiert ... das müsste man natürlich auch noch rausnehmen ... das war nur, weil ich dachte, dass ich evtl. etwas testen kann und Löschen ist nie gut wenn man nicht 100% sicher ist ... nicht dass man da etwas löscht, das man nicht möchte ... :)
 

Mannimaker

Mitglied
Da ich jetzt leider weg muss kann ich es nicht fertig machen ... ich habe aber mal auf die Schnelle einfach etwas Code erstellt. Das Verschieben aller Elemente kommt von ChatGPT und das alles ist ungetestet. Aber evtl. ist es ja ein Anfang für jemand anderes oder wenn es Probleme gibt kann die jemand auf die Schnelle beheben ...

Java:
import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;

public class MergeFiles {

    public static final String DIVIDER = ",";
    public static void main(String[] args) throws IOException {
        String folder;

        if (args.length == 1 )
            folder = args[0];
        else
            folder = new File(".").getAbsolutePath();

        renameFolder(folder);
    }

    private static void renameFolder(final String folderName) throws IOException {
        File folder = new File(folderName);
        if (!folder.exists() ||!folder.isDirectory()) {
            System.out.println("Folder " + folderName + " does not exist or not a folder");
        }

        for (File entry : folder.listFiles()) {
            System.out.print("Checking " + entry.getName());
            if (!entry.isDirectory()) {
                System.out.println(": not a directory!");
                continue;
            }

            if (!nameMatches(entry)) {
                System.out.println(": not matching name");
                continue;
            }

            System.out.println(": renaming!");
            handle(folder, entry.getName());
          
            // entry.delete();
        }
    }

    private static void handle(final File folder, final String name) throws IOException {
        String targetName = getTargetName(name);
        Path source = Path.of(folder.getAbsolutePath(), name);
        Path target = Path.of(folder.getAbsolutePath(), targetName);
        moveDirectory(source, target);
    }

    private static String getTargetName(final String name) {
        return name.substring(0, name.indexOf(DIVIDER));
    }

    private static boolean nameMatches(final File entry) {
        return entry.getName().contains(DIVIDER);
    }

    // Auf die Schnelle von ChatGPT erstellt
    public static void moveDirectory(Path source, Path target) throws IOException {
        if (!Files.isDirectory(source)) {
            throw new IllegalArgumentException("Source must be a directory.");
        }

        if (!Files.exists(target)) {
            Files.createDirectories(target);
        }

        Files.walkFileTree(source, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                Path targetDir = target.resolve(source.relativize(dir));
                if (!Files.exists(targetDir)) {
                    Files.createDirectory(targetDir);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Files.move(file, target.resolve(source.relativize(file)));
                return FileVisitResult.CONTINUE;
            }
        });
    }
}

Edit: Das delete ist auskommentiert ... das müsste man natürlich auch noch rausnehmen ... das war nur, weil ich dachte, dass ich evtl. etwas testen kann und Löschen ist nie gut wenn man nicht 100% sicher ist ... nicht dass man da etwas löscht, das man nicht möchte ... :)
Oh Danke KonradN,

dass ist jetzt aber kein Script mehr für ne BAT-Datei :-D

danke für deine Mühen :) kann mir hier sonst noch jemand helfen oder ich warte auf Konrad :-D

Danke für EURE Hilfe :)

lg Mani
 

KonradN

Super-Moderator
Mitarbeiter
Das ist ein Java Programm .. muss in die Datei MergeFiles.java

Start per java MergeFiles.java

Stell sicher, dass du ein aktuelles Java hat … also Java 21 ist die aktuelle (LTS) Version.

Sollte dein Java zu alt sein, dann musst du erst mit javac übersetzen (wie bereits von mihe7 beschrieben)
 

Mannimaker

Mitglied
Dann sag ich mal DANKE Konrad :)

Da bin ich jetzt leider mit meinem "nicht vorhandenen Wissen" raus :) aber danke für dein Hilfe und einen schönen Abend, da du ja schon weg musst, lass dich bitte nicht mehr aufhalten :-D Danke für alles.

Sollte ich das mit Java irgendwie hinbekommen, muss halt komplett überall bei NULL anfangen :)
 

Mannimaker

Mitglied
Also, ich muss gestehen, ich kapiere es nicht :-D kann mir vielleicht jemand helfen oder das "zusammenbasteln" :-/

Würde mich sehr freuen.

Danke.

lg Mani
 

Mannimaker

Mitglied
Hi,

dann wirst du sagen müssen, wo genau es bei dir nicht weiter geht.

Wir können ja schlecht für dich klicken.

Gruß,
Martin
Hi Martin,

ja, ich habe ja geschrieben, das ich mich garnicht auskenne - ich hab halt nur ein bisschen mit CHATGPT herumexperimentiert undversucht daraus ein Windows Skript zu machen - ich habe ja erwähnt, dass ich hierbei leider genau NICHTS kann :-/

Genau dass ist ja mein Problem :-/

lg Mani
 

Marinek

Bekanntes Mitglied
Und statt die Sachen manuell zu sortieren, willst du dich mit 0 Wissen und 0 Vorbereitung hier durchquälen?

Puhh mal gucken: Hast du java heruntergeladen & installiert?
 

Jw456

Top Contributor
Die erste Frage wäre hast du überhaupt Java auf deinen Rechner installiert. Und wenn ja welche Version.

Tippe doch mal unter CMD „java -version“ was kommt da?

 
Zuletzt bearbeitet:

Mannimaker

Mitglied
Hallo Ihr zwei,

naja, ich würde diese Anforderung ja öfter benötigen, darum.

Java habe ich: 1.8.0_381 - hab oben ja auch geschrieben, ich weiß nicht, ob ich hier richtig bin oder mir jemand helfen kann.

Für mich wäre es auch okay, wenn mir dass jemand schreiben könnte, so dass ich es einfach in dem Verzeichnis ausführen kann mit nem "jar.File" oder so und ich bezahle dafür - es muss mir eh niemand gratis helfen :)

lg
 

Marinek

Bekanntes Mitglied
Ja, also mit keinen Einsatz von dir können wir das hier abbrechen. Du kannst gerne in der Jobbörse was posten... Oder entsprechende Dienste bemühen.

Weiter oben hat Konrad geschrieben, dass du das neuste Java brauchst.

Java 1.8 ist zu alt.
 

Mannimaker

Mitglied
Ja, recht viel Einsatz kann ich nicht geben - ich kann eben nicht programmieren (leider).

java version "21" 2023-09-19 LTS - hätte ich jetzt oben.

Aber ich will hier eh niemanden belästigen :)

Danke trotzdem für Eure Hilfe.
 

Marinek

Bekanntes Mitglied
Ja, wie man weiter vorgeht, steht ja oben...

Ja, recht viel Einsatz kann ich nicht geben

Aber muss ich dann hier schreiben was du als nächstes machen sollst!?

Hier kann man ja hoffentlich vorraussetzen, dass man die DInge, die oben geschrieben worden sind, gerade so noch weiß 10 Minuten später.
 

Mannimaker

Mitglied
Ja, wie man weiter vorgeht, steht ja oben...



Aber muss ich dann hier schreiben was du als nächstes machen sollst!?

Hier kann man ja hoffentlich vorraussetzen, dass man die DInge, die oben geschrieben worden sind, gerade so noch weiß 10 Minuten später.
Ja, ich kann mir die Dinge schon merken, aber wenn man das noch NIE gemacht hat ist man leider in diesem Bereich der "SUPERDAU" :-D

Und ich möchte Euch ja nicht einmal auf die Nerven gehen :)

Wie geschrieben, ein Praktikant, der eben Programmieren konnte, hat mir damals einfach ne Jar gebastelt die ich ausführen musste, dazu brauchte ich genau NULL wissen :-/

Tut mir leid.
 

KonradN

Super-Moderator
Mitarbeiter
@mihe7 Basiert das noch auf meinem Code? Oder hast Du da schon Anpassungen gemacht (oder gar etwas eigenes erstellt?)

Das wäre ggf. hilfreich, damit Andere auch etwas anpassen können bei weiteren Hilfen ohne dass wir dann mit 10 Leuten 27 verschiedene Stände haben :)
 

KonradN

Super-Moderator
Mitarbeiter
Und ich möchte Euch ja nicht einmal auf die Nerven gehen :)
Du gehst uns nicht auf die Nerven - wir helfen hier gerne (Was Du hoffentlich an den Antworten auch merkst). Wenn ein java -version etwas von Java 21 sagt, dann kannst Du das java File ebenso ausführen wie das jar File. Das war eine Anpassung, die gerade für Anfänger wirklich gut war.

@mihe7 Kennst Du JBang? Das fällt mir in dem Zusammenhang auch ein. Unter Linux/Mac hast Du das dann wie ein Script und so ... Mit der Möglichkeit, jar Dateien einzubinden und so ... @Mannimaker Das mit dem JBang geht erst einmal nicht an Dich - lass Dich da jetzt bitte nicht verwirren nur weil ich zu faul war, das als PM zu schreiben!
 

Mannimaker

Mitglied
Du gehst uns nicht auf die Nerven - wir helfen hier gerne (Was Du hoffentlich an den Antworten auch merkst). Wenn ein java -version etwas von Java 21 sagt, dann kannst Du das java File ebenso ausführen wie das jar File. Das war eine Anpassung, die gerade für Anfänger wirklich gut war.

@mihe7 Kennst Du JBang? Das fällt mir in dem Zusammenhang auch ein. Unter Linux/Mac hast Du das dann wie ein Script und so ... Mit der Möglichkeit, jar Dateien einzubinden und so ... @Mannimaker Das mit dem JBang geht erst einmal nicht an Dich - lass Dich da jetzt bitte nicht verwirren nur weil ich zu faul war, das als PM zu schreiben!
Gebt dem Mann doch endlich ein Jar :)

Ausführen:
Java:
java -jar RenameFolders.jar C:\pfad\mit\ordnern
Hallo Mihe :)

OHHH, dass hast du jetzt lustig geschrieben 🙃
danke dir, ich werde das gleich mal probieren in einer sicheren Umgebung und dir ein Feedback geben :)

DANKEEE :)

lg Manuel
 

Mannimaker

Mitglied
Gebt dem Mann doch endlich ein Jar :)

Ausführen:
Java:
java -jar RenameFolders.jar C:\pfad\mit\ordnern
Danke dir, hat grundsätzlich funktioniert - aber er hat die "alten" Ordner quasi stehen lassen und den ganzen Inhalt darunter verschoben in den Ordner ohne die Beistriche :)

Kann man diese Jar auch einfach in dem Ordner mit einem Doppelklick ausführen? :)

Aber JA, das geht definitiv in die richtige Richtung - DANKE!
 

Mannimaker

Mitglied
Du gehst uns nicht auf die Nerven - wir helfen hier gerne (Was Du hoffentlich an den Antworten auch merkst). Wenn ein java -version etwas von Java 21 sagt, dann kannst Du das java File ebenso ausführen wie das jar File. Das war eine Anpassung, die gerade für Anfänger wirklich gut war.

@mihe7 Kennst Du JBang? Das fällt mir in dem Zusammenhang auch ein. Unter Linux/Mac hast Du das dann wie ein Script und so ... Mit der Möglichkeit, jar Dateien einzubinden und so ... @Mannimaker Das mit dem JBang geht erst einmal nicht an Dich - lass Dich da jetzt bitte nicht verwirren nur weil ich zu faul war, das als PM zu schreiben!
Ja, aber ich will halt niemanden aufhalten und blöde Fragen oder Anforderungen stellen, weil ich eben da nichts kann :-/
Okay, zuerst konnte ich nämlich dieses Jar File nicht einfach so ausführen, sondern musste schon über die CMD gehen :)

OKAY, JBang sagt mir eh nichts :)

Danke an ALLE die da gerade helfen 🙌
 

mihe7

Top Contributor
Danke dir, hat grundsätzlich funktioniert - aber er hat die "alten" Ordner quasi stehen lassen und den ganzen Inhalt darunter verschoben in den Ordner ohne die Beistriche :)
Ja, das hat @KonradN auch geschrieben, dass die Ordner erstmal stehenbleiben. Das Verschieben als solches war aber okay oder? Dann bau ich Dir noch schnell eine Jar, die die Ordner im Anschluss löscht.

Kann man diese Jar auch einfach in dem Ordner mit einem Doppelklick ausführen? :)
Ja, sollte funktionieren. Du musst allerdings aufpassen, dass Java 21 (und nicht Java 8) für den Dateityp verwendet wird.

EDIT: Version mit eingebautem Löschen im Anhang

Hier noch der geänderte Code:
Java:
public class RenameFolders {
    public static final String DIVIDER = ",";    
    public static void main(String[] args) throws IOException {
        String folder;
        if (args.length == 1 )
            folder = args[0];
        else
            folder = new File(".").getAbsolutePath();
        renameFolder(folder);        
    }
    private static void renameFolder(final String folderName) throws IOException {
        File folder = new File(folderName);
        if (!folder.exists() ||!folder.isDirectory()) {
            System.out.println("Folder " + folderName + " does not exist or not a folder");
        }
        for (File entry : folder.listFiles()) {
            System.out.print("Checking " + entry.getName());
            if (!entry.isDirectory()) {
                System.out.println(": not a directory!");
                continue;
            }
            if (!nameMatches(entry)) {
                System.out.println(": not matching name");
                continue;
            }
            System.out.println(": renaming!");
            handle(folder, entry.getName());
        }
    }
    private static void handle(final File folder, final String name) throws IOException {
        String targetName = getTargetName(name);
        Path source = Path.of(folder.getAbsolutePath(), name);
        Path target = Path.of(folder.getAbsolutePath(), targetName);
        System.out.println("Moving " + source + " to " + target);
        moveDirectory(source, target);
    }
    private static String getTargetName(final String name) {
        return name.substring(0, name.indexOf(DIVIDER));
    }
    private static boolean nameMatches(final File entry) {
        return entry.getName().contains(DIVIDER);
    }
    // Auf die Schnelle von ChatGPT erstellt
    public static void moveDirectory(Path source, Path target) throws IOException {
        if (!Files.isDirectory(source)) {
            throw new IllegalArgumentException("Source must be a directory.");
        }
        if (!Files.exists(target)) {
            Files.createDirectories(target);
        }
        Files.walkFileTree(source, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                Path targetDir = target.resolve(source.relativize(dir));
                if (!Files.exists(targetDir)) {
                    Files.createDirectory(targetDir);
                }
                return FileVisitResult.CONTINUE;
            }
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Files.move(file, target.resolve(source.relativize(file)));
                return FileVisitResult.CONTINUE;
            }
            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException ex) throws IOException {
                if (ex != null) {
                    throw ex;
                }
                Files.delete(dir);
                return FileVisitResult.CONTINUE;
            }
        });
    }    
}
 

Anhänge

  • RenameFolders.jar
    3,2 KB · Aufrufe: 0
Zuletzt bearbeitet:

Mannimaker

Mitglied
Ja, das hat @KonradN auch geschrieben, dass die Ordner erstmal stehenbleiben. Das Verschieben als solches war aber okay oder? Dann bau ich Dir noch schnell eine Jar, die die Ordner im Anschluss löscht.


Ja, sollte funktionieren. Du musst allerdings aufpassen, dass Java 21 (und nicht Java 8) für den Dateityp verwendet wird.

EDIT: Version mit eingebautem Löschen im Anhang

Hier noch der geänderte Code:
Java:
public class RenameFolders {
    public static final String DIVIDER = ",";   
    public static void main(String[] args) throws IOException {
        String folder;
        if (args.length == 1 )
            folder = args[0];
        else
            folder = new File(".").getAbsolutePath();
        renameFolder(folder);       
    }
    private static void renameFolder(final String folderName) throws IOException {
        File folder = new File(folderName);
        if (!folder.exists() ||!folder.isDirectory()) {
            System.out.println("Folder " + folderName + " does not exist or not a folder");
        }
        for (File entry : folder.listFiles()) {
            System.out.print("Checking " + entry.getName());
            if (!entry.isDirectory()) {
                System.out.println(": not a directory!");
                continue;
            }
            if (!nameMatches(entry)) {
                System.out.println(": not matching name");
                continue;
            }
            System.out.println(": renaming!");
            handle(folder, entry.getName());
        }
    }
    private static void handle(final File folder, final String name) throws IOException {
        String targetName = getTargetName(name);
        Path source = Path.of(folder.getAbsolutePath(), name);
        Path target = Path.of(folder.getAbsolutePath(), targetName);
        System.out.println("Moving " + source + " to " + target);
        moveDirectory(source, target);
    }
    private static String getTargetName(final String name) {
        return name.substring(0, name.indexOf(DIVIDER));
    }
    private static boolean nameMatches(final File entry) {
        return entry.getName().contains(DIVIDER);
    }
    // Auf die Schnelle von ChatGPT erstellt
    public static void moveDirectory(Path source, Path target) throws IOException {
        if (!Files.isDirectory(source)) {
            throw new IllegalArgumentException("Source must be a directory.");
        }
        if (!Files.exists(target)) {
            Files.createDirectories(target);
        }
        Files.walkFileTree(source, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                Path targetDir = target.resolve(source.relativize(dir));
                if (!Files.exists(targetDir)) {
                    Files.createDirectory(targetDir);
                }
                return FileVisitResult.CONTINUE;
            }
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Files.move(file, target.resolve(source.relativize(file)));
                return FileVisitResult.CONTINUE;
            }
            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException ex) throws IOException {
                if (ex != null) {
                    throw ex;
                }
                Files.delete(dir);
                return FileVisitResult.CONTINUE;
            }
        });
    }   
}
DANKE Mihe,

werde ich gleich nochmals testen :-D Ah, dass hatte Konrad gemeint, das hab ich missverstanden :)
Danke für die Hilfe und für die Anpassung.

Ich gebe wieder Bescheid. :)
 

Mannimaker

Mitglied
Ja, das hat @KonradN auch geschrieben, dass die Ordner erstmal stehenbleiben. Das Verschieben als solches war aber okay oder? Dann bau ich Dir noch schnell eine Jar, die die Ordner im Anschluss löscht.


Ja, sollte funktionieren. Du musst allerdings aufpassen, dass Java 21 (und nicht Java 8) für den Dateityp verwendet wird.

EDIT: Version mit eingebautem Löschen im Anhang

Hier noch der geänderte Code:
Java:
public class RenameFolders {
    public static final String DIVIDER = ",";  
    public static void main(String[] args) throws IOException {
        String folder;
        if (args.length == 1 )
            folder = args[0];
        else
            folder = new File(".").getAbsolutePath();
        renameFolder(folder);      
    }
    private static void renameFolder(final String folderName) throws IOException {
        File folder = new File(folderName);
        if (!folder.exists() ||!folder.isDirectory()) {
            System.out.println("Folder " + folderName + " does not exist or not a folder");
        }
        for (File entry : folder.listFiles()) {
            System.out.print("Checking " + entry.getName());
            if (!entry.isDirectory()) {
                System.out.println(": not a directory!");
                continue;
            }
            if (!nameMatches(entry)) {
                System.out.println(": not matching name");
                continue;
            }
            System.out.println(": renaming!");
            handle(folder, entry.getName());
        }
    }
    private static void handle(final File folder, final String name) throws IOException {
        String targetName = getTargetName(name);
        Path source = Path.of(folder.getAbsolutePath(), name);
        Path target = Path.of(folder.getAbsolutePath(), targetName);
        System.out.println("Moving " + source + " to " + target);
        moveDirectory(source, target);
    }
    private static String getTargetName(final String name) {
        return name.substring(0, name.indexOf(DIVIDER));
    }
    private static boolean nameMatches(final File entry) {
        return entry.getName().contains(DIVIDER);
    }
    // Auf die Schnelle von ChatGPT erstellt
    public static void moveDirectory(Path source, Path target) throws IOException {
        if (!Files.isDirectory(source)) {
            throw new IllegalArgumentException("Source must be a directory.");
        }
        if (!Files.exists(target)) {
            Files.createDirectories(target);
        }
        Files.walkFileTree(source, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                Path targetDir = target.resolve(source.relativize(dir));
                if (!Files.exists(targetDir)) {
                    Files.createDirectory(targetDir);
                }
                return FileVisitResult.CONTINUE;
            }
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Files.move(file, target.resolve(source.relativize(file)));
                return FileVisitResult.CONTINUE;
            }
            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException ex) throws IOException {
                if (ex != null) {
                    throw ex;
                }
                Files.delete(dir);
                return FileVisitResult.CONTINUE;
            }
        });
    }  
}
GEIL, hat FUNKTIONIERT - bin immer wieder begeistert, was schlaue Köpfe so schnell schreiben können :-D

DANKE MIHE und Konrad!

Das mit dem Doppelklick geht leider noch nicht - habe aber beim Ausführen, wie geschrieben, die Java 21 ausgewählt :) aber alles andere läuft PERFEKT! :)

Kann man das mit dem Doppelklick noch irgendwie hinbekommen?

DANKE EUCH!!!!!!!!

ERGÄNZUNG - gerade noch getestet, wenn im Unterordner dann noch eine Datei ist - die genauso heisst, gibt es einen Fehler - da die Datei ja schon existiert, könnte man diese einfach überschreiben? :) hab ich erst jetzt noch getestet, sorry.

DANKE!!
 

KonradN

Super-Moderator
Mitarbeiter
Das Problem ist ggf. das Verzeichnis. Ist er beim Doppelklick evtl. nicht im Verzeichnis?

Da wäre es evtl. denkbar, einfach ein Start-Script zu schreiben. Welches System nutzt Du?

Unter Windows wäre es etwas wie
Code:
java -jar %~dp0RenameFolders.jar %~dp0

Das jar File muss im gleichen Verzeichnis sein und dann wird da als Parameter das Verzeichnis genommen, in dem das Script liegt.
Evtl. in die nächste Zeile noch ein pause - dann bleibt das Fenster nach der Ausführung noch offen und man sieht ggf. noch Fehlermeldungen.

Unter Linux / MacOS wäre es etwas wie:
Code:
#!/bin/bash

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
java -jar "$DIR/RenameFolders.jar" "$DIR"

Die Scripte sind aus dem Kopf heraus geschrieben und Tipp- oder Denkfehler könnten vorkommen. Das also erst einmal als Idee. Probleme mit genauen Details zum System und ich kann es dann ggf. auch einfach einmal testen.
 

Mannimaker

Mitglied
Das Problem ist ggf. das Verzeichnis. Ist er beim Doppelklick evtl. nicht im Verzeichnis?

Da wäre es evtl. denkbar, einfach ein Start-Script zu schreiben. Welches System nutzt Du?

Unter Windows wäre es etwas wie
Code:
java -jar %~dp0RenameFolders.jar %~dp0

Das jar File muss im gleichen Verzeichnis sein und dann wird da als Parameter das Verzeichnis genommen, in dem das Script liegt.
Evtl. in die nächste Zeile noch ein pause - dann bleibt das Fenster nach der Ausführung noch offen und man sieht ggf. noch Fehlermeldungen.

Unter Linux / MacOS wäre es etwas wie:
Code:
#!/bin/bash

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
java -jar "$DIR/RenameFolders.jar" "$DIR"

Die Scripte sind aus dem Kopf heraus geschrieben und Tipp- oder Denkfehler könnten vorkommen. Das also erst einmal als Idee. Probleme mit genauen Details zum System und ich kann es dann ggf. auch einfach einmal testen.
Danke für die Info,

die Jar Datei befindet sich genau in dem Verzeichnis, wo er die Ordner umbenennen soll - das sollte also passen :)
Benütze WIN11 22H2. Das mit dem Skript probiere ich gleich mal aus :)
Und genau, sobald eben im Unterordner eine gleiche Datei ist, bricht er ab - da sollte er die Datei einfach ersetzten, wenn das noch möglich wäre :)
DANKE!

Das mit dem WIN-Skript und dem "Pause" darunter klappt super :)

Fehlermeldung im Unterordner - FileAlreadyExists

:-D Wenn das noch machbar ist - ist es PERFEKT! :-D
 

KonradN

Super-Moderator
Mitarbeiter
Ok, den Fall haben wir bisher noch nicht bedacht.

@mihe7 kannst Du das noch anpassen? Es sollte reichen, visitFiles so anzupassen:
Java:
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Path targetFile = target.resolve(source.relativize(file));
                Files.deleteIfExists(targetFile);
                Files.move(file, targetFile);
                return FileVisitResult.CONTINUE;
            }

Und dann halt wieder ein jar File bauen. Da hast Du schon irgendwas gebaut und ich bin gerade zu faul, da erst ein Projekt zu bauen, dass mir die ausführbare jar Datei erstellt.
 

White_Fox

Top Contributor
Vielleicht kann der hier ja auch, was du willst:

Ansonsten steht noch mehr zur Auswahl:

Ich benutze ja schon seit Ewigkeiten Joe, aber das verdaut nur Dateien, keine Ordner.
 

mihe7

Top Contributor
Da hast Du schon irgendwas gebaut und ich bin gerade zu faul, da erst ein Projekt zu bauen, dass mir die ausführbare jar Datei erstellt.
Lol, ja, ich hab auch kein Projekt angelegt :)
Main-Class: tmp.RenameFolders
Class-Path: .
und
Code:
javac -cp . tmp\*.java
jar cfvm RenameFolders.jar manifest.mf tmp\*.class
:D
 

Mannimaker

Mitglied
Ok, den Fall haben wir bisher noch nicht bedacht.

@mihe7 kannst Du das noch anpassen? Es sollte reichen, visitFiles so anzupassen:
Java:
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Path targetFile = target.resolve(source.relativize(file));
                Files.deleteIfExists(targetFile);
                Files.move(file, targetFile);
                return FileVisitResult.CONTINUE;
            }

Und dann halt wieder ein jar File bauen. Da hast Du schon irgendwas gebaut und ich bin gerade zu faul, da erst ein Projekt zu bauen, dass mir die ausführbare jar Datei erstellt.
Danke nochmals Konrad 🙃
Das geht ja richtig schnell bei EUCH :-D HAMMER!!!! DANKE!
 

Mannimaker

Mitglied
Vielleicht kann der hier ja auch, was du willst:

Ansonsten steht noch mehr zur Auswahl:

Ich benutze ja schon seit Ewigkeiten Joe, aber das verdaut nur Dateien, keine Ordner.
Ja, ich habe sogar die Vollversion von Rename Expert - aber der hat ein Problem mit ähnlichen Namen.. und alle anderen Demos hätte ich mir auch schon angesehen, bevor ich hier geschrieben habe :-/ aber danke für deinen Tipp.

:-D
 

mihe7

Top Contributor
Du kannst das auch selbst machen.
  1. Einen Ordner anlegen
  2. In diesem Ordner einen Unterordner mit dem Namen tmp anlegen.
  3. Die Dateien manifest.mf (s. oben) und build.bat (s. unten) in den Ordner speichern, die Datei RenameFolders.java (s. unten) in den Unterordner speichern.
  4. Die build.bat aufrufen.
Danach solltest Du die RenamesFolders.jar im Ordner haben.

Code:
javac -cp . tmp\*.java
jar cfvm RenameFolders.jar manifest.mf tmp\*.class

Java:
package tmp;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;

public class RenameFolders {

    public static final String DIVIDER = ",";   

    public static void main(String[] args) throws IOException {
        String folder;

        if (args.length == 1 )
            folder = args[0];
        else
            folder = new File(".").getAbsolutePath();

        renameFolder(folder);       
    }

    private static void renameFolder(final String folderName) throws IOException {
        File folder = new File(folderName);
        if (!folder.exists() ||!folder.isDirectory()) {
            System.out.println("Folder " + folderName + " does not exist or not a folder");
        }

        for (File entry : folder.listFiles()) {
            System.out.print("Checking " + entry.getName());
            if (!entry.isDirectory()) {
                System.out.println(": not a directory!");
                continue;
            }

            if (!nameMatches(entry)) {
                System.out.println(": not matching name");
                continue;
            }

            System.out.println(": renaming!");
            handle(folder, entry.getName());
        }
    }

    private static void handle(final File folder, final String name) throws IOException {
        String targetName = getTargetName(name);
        Path source = Path.of(folder.getAbsolutePath(), name);
        Path target = Path.of(folder.getAbsolutePath(), targetName);
        System.out.println("Moving " + source + " to " + target);
        moveDirectory(source, target);
    }

    private static String getTargetName(final String name) {
        return name.substring(0, name.indexOf(DIVIDER));
    }

    private static boolean nameMatches(final File entry) {
        return entry.getName().contains(DIVIDER);
    }

    // Auf die Schnelle von ChatGPT erstellt
    public static void moveDirectory(Path source, Path target) throws IOException {
        if (!Files.isDirectory(source)) {
            throw new IllegalArgumentException("Source must be a directory.");
        }

        if (!Files.exists(target)) {
            Files.createDirectories(target);
        }

        Files.walkFileTree(source, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                Path targetDir = target.resolve(source.relativize(dir));
                if (!Files.exists(targetDir)) {
                    Files.createDirectory(targetDir);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Path targetFile = target.resolve(source.relativize(file));
                Files.deleteIfExists(targetFile);
                Files.move(file, targetFile);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException ex) throws IOException {
                if (ex != null) {
                    throw ex;
                }

                Files.delete(dir);
                return FileVisitResult.CONTINUE;
            }
        });
    }   
}
 

Mannimaker

Mitglied
Danke für die Info Mihe
Du kannst das auch selbst machen.
  1. Einen Ordner anlegen
  2. In diesem Ordner einen Unterordner mit dem Namen tmp anlegen.
  3. Die Dateien manifest.mf (s. oben) und build.bat (s. unten) in den Ordner speichern, die Datei RenameFolders.java (s. unten) in den Unterordner speichern.
  4. Die build.bat aufrufen.
Danach solltest Du die RenamesFolders.jar im Ordner haben.

Code:
javac -cp . tmp\*.java
jar cfvm RenameFolders.jar manifest.mf tmp\*.class

Java:
package tmp;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitOption;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.EnumSet;

public class RenameFolders {

    public static final String DIVIDER = ",";  

    public static void main(String[] args) throws IOException {
        String folder;

        if (args.length == 1 )
            folder = args[0];
        else
            folder = new File(".").getAbsolutePath();

        renameFolder(folder);      
    }

    private static void renameFolder(final String folderName) throws IOException {
        File folder = new File(folderName);
        if (!folder.exists() ||!folder.isDirectory()) {
            System.out.println("Folder " + folderName + " does not exist or not a folder");
        }

        for (File entry : folder.listFiles()) {
            System.out.print("Checking " + entry.getName());
            if (!entry.isDirectory()) {
                System.out.println(": not a directory!");
                continue;
            }

            if (!nameMatches(entry)) {
                System.out.println(": not matching name");
                continue;
            }

            System.out.println(": renaming!");
            handle(folder, entry.getName());
        }
    }

    private static void handle(final File folder, final String name) throws IOException {
        String targetName = getTargetName(name);
        Path source = Path.of(folder.getAbsolutePath(), name);
        Path target = Path.of(folder.getAbsolutePath(), targetName);
        System.out.println("Moving " + source + " to " + target);
        moveDirectory(source, target);
    }

    private static String getTargetName(final String name) {
        return name.substring(0, name.indexOf(DIVIDER));
    }

    private static boolean nameMatches(final File entry) {
        return entry.getName().contains(DIVIDER);
    }

    // Auf die Schnelle von ChatGPT erstellt
    public static void moveDirectory(Path source, Path target) throws IOException {
        if (!Files.isDirectory(source)) {
            throw new IllegalArgumentException("Source must be a directory.");
        }

        if (!Files.exists(target)) {
            Files.createDirectories(target);
        }

        Files.walkFileTree(source, EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
                Path targetDir = target.resolve(source.relativize(dir));
                if (!Files.exists(targetDir)) {
                    Files.createDirectory(targetDir);
                }
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                Path targetFile = target.resolve(source.relativize(file));
                Files.deleteIfExists(targetFile);
                Files.move(file, targetFile);
                return FileVisitResult.CONTINUE;
            }

            @Override
            public FileVisitResult postVisitDirectory(Path dir, IOException ex) throws IOException {
                if (ex != null) {
                    throw ex;
                }

                Files.delete(dir);
                return FileVisitResult.CONTINUE;
            }
        });
    }  
}
Danke für die Info Mihe, hat soweit funktioniert - hatte nur 2x ne Fehlermeldung - 1x war wohl der Pfad in den Unterordnern zu lange und 1x konnte er den Ordner wohl nicht löschen, wesshalb auch immer (den bekomme ich immer noch nicht weg :D)

Aber danke mal soweit, muss dass nochmals testen und sonst sende ich mal eine Fehlermeldung rein.

danke dir
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
1 Mini Programm, keine Eingabe möglich.. Java Basics - Anfänger-Themen 6
CT9288 Mini Anfänger-Problem mit loops, statements und ; Java Basics - Anfänger-Themen 4
B JUnit - Mini-Test Java Basics - Anfänger-Themen 9
G mini mp3 player Java Basics - Anfänger-Themen 4
G Java für Opera Mini (S60) Java Basics - Anfänger-Themen 2
W Java-PRogramm liest als EXE-File Nicht USB, jedoch aus NetBeans Java Basics - Anfänger-Themen 23
tomzen Programm ignoriert in der Ausführung Code Java Basics - Anfänger-Themen 8
S Erstes Programm: Hallo Welt funktioniert nicht. Java Basics - Anfänger-Themen 3
A "Hello World"-Programm läuft nicht Java Basics - Anfänger-Themen 16
J Delay erzeugen, ohne Programm zu blockieren Java Basics - Anfänger-Themen 7
Ü Dead Code im Programm? Java Basics - Anfänger-Themen 13
M Java Mail Programm Java Basics - Anfänger-Themen 4
E Java Programm zur anzeige, ob Winter- oder Sommerzeit herrscht Java Basics - Anfänger-Themen 62
G JTable Listselectionlistener friert das Programm ein Java Basics - Anfänger-Themen 8
M Das Programm stellt nichts dar Java Basics - Anfänger-Themen 2
K Programm compilierbar aber nicht ausführbar... Java Basics - Anfänger-Themen 21
Z Programm Ideen Java Basics - Anfänger-Themen 8
P Wie kann ich in meinem Java Programm etwas dauerhaft speichern? Java Basics - Anfänger-Themen 5
P Wie kann ich beispielsweise Speicherstände eines Spiels DAUERHAFT in meinem Programm speichern? Java Basics - Anfänger-Themen 3
H Java-Programm zur Ausgabe von Zuständen Java Basics - Anfänger-Themen 80
G Kann Java-Programm nicht als jar aufrufen, auch als EXE nicht Java Basics - Anfänger-Themen 19
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
T Programm stürzt ab Java Basics - Anfänger-Themen 40
KeinJavaFreak Erste Schritte Programm "Java(TM) Platform SE binary " nicht vorhanden Java Basics - Anfänger-Themen 1
G Programm läuft durch, ohne Eingabe aus dem Chat abzuwarten Java Basics - Anfänger-Themen 4
N Programm Funktioniert mit .txt Datei aber nicht mit .rtf Datei Java Basics - Anfänger-Themen 2
N Interpreter-Fehler Compiler zeigt keine Fehler an, aber das Programm läuft nicht (BlueJ) Java Basics - Anfänger-Themen 2
D Java Programm mit Batch-Datei starten Java Basics - Anfänger-Themen 32
Jul1n4tor Programm mit Scanner und If-Statements Java Basics - Anfänger-Themen 2
D Wie sehe ich ein Java-Programm? Java Basics - Anfänger-Themen 27
K Ist das Programm schlecht bzw. schlampig programmiert ? Java Basics - Anfänger-Themen 9
Zrebna Kann Java Programm nicht in Konsole ausführen Java Basics - Anfänger-Themen 1
K Warum läuft das Programm nicht(bzw. nicht richtig) Java Basics - Anfänger-Themen 4
M Von Eclipse zum richtigen Programm Java Basics - Anfänger-Themen 1
nbergmann IntelliJ: Wie lade ich ein fertiges Programm aus dem Lehrbuch? Java Basics - Anfänger-Themen 26
D Anfängerfrage zu meinem Programm. Java Basics - Anfänger-Themen 15
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 22
I Jetty starten von Programm (Main) Java Basics - Anfänger-Themen 27
Kydo Programm Beschreibung Java Basics - Anfänger-Themen 3
nbergmann Eclipse: Lehrbuch-Programm startet nicht Java Basics - Anfänger-Themen 7
T Java FXML selbes Fenster verschiedene Stellen im Programm Java Basics - Anfänger-Themen 5
frager2345 Programm erstellen ohne Autoboxing und Unboxing Java Basics - Anfänger-Themen 13
D JAVA Programm schreiben Java Basics - Anfänger-Themen 46
P exportiertes Programm funktioniert nur teilweise Java Basics - Anfänger-Themen 7
J Mein Programm läuft bei der ersten Eingabe nicht mehr weiter, woran liegt das? Java Basics - Anfänger-Themen 6
M Wo hält das Programm an? Java Basics - Anfänger-Themen 11
J Mein Java Programm lässt sich nicht mehr bearbeiten Java Basics - Anfänger-Themen 2
Fugover Programm funktioniert nicht Java Basics - Anfänger-Themen 11
Fugover Kopfrechnen-Programm Java Basics - Anfänger-Themen 6
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
sserio Wieso funktioniert mein Programm nicht Java Basics - Anfänger-Themen 2
sserio Größtes Palindrom-Produkt Programm funktioniert nur halb Java Basics - Anfänger-Themen 23
J selbst erstellte Datei mit Programm öffnen Java Basics - Anfänger-Themen 10
F nach Methode Programm nicht beenden Java Basics - Anfänger-Themen 9
A wie kann ich es in meinem Programm rein tun Java Basics - Anfänger-Themen 8
S Fehler beim Programm Java Basics - Anfänger-Themen 2
Jose05 Fehler im Programm feststellen Java Basics - Anfänger-Themen 2
F Kann mir jemand kurz dieses Programm erklären? Java Basics - Anfänger-Themen 22
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
J Nach dem Exportieren funktioniert mein Programm nicht mehr Java Basics - Anfänger-Themen 8
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
J Kann ich mein Programm so schreiben? Java Basics - Anfänger-Themen 4
A Lotto Programm Java Basics - Anfänger-Themen 3
S Programm erstellen Java Basics - Anfänger-Themen 3
A Verarbeiten einer Excel Datei durch das java-Programm Java Basics - Anfänger-Themen 3
S MinMax Programm erstellen Java Basics - Anfänger-Themen 4
J Interpreter-Fehler Programm gibt nicht gewünschtes Ergebnis aus Java Basics - Anfänger-Themen 11
brypa Programm mit Eingabe Java Basics - Anfänger-Themen 129
B Java Programm soll mit Python kommunizeren Java Basics - Anfänger-Themen 1
SpigBin Programm läuft nicht weiter... Java Basics - Anfänger-Themen 10
M JAVA Programm in Website einbinden Java Basics - Anfänger-Themen 19
B Programm, dass alle 3 Tage eine Webseite öffnet? Java Basics - Anfänger-Themen 20
B Programm beendet sich nicht und weiteres seltsames Verhalten Java Basics - Anfänger-Themen 9
N Eclipse Programm normal ausführen Java Basics - Anfänger-Themen 1
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
C Programm das feststellen kann, ob eine eingegebene Zahl einem Schaltjahr entspricht, richtig geschrieben? Java Basics - Anfänger-Themen 11
C Brauche Hilfe um ein Programm zu schreiben Java Basics - Anfänger-Themen 8
F Frage betreff Programm mit dem man C++-Code in JAVA-Code übersetzen lassen kann Java Basics - Anfänger-Themen 2
nevel Programm für die Summer der Zahlen 1- 1ß Java Basics - Anfänger-Themen 12
WAB9703-04 Programm zum automatischen Ausfüllen von Formularen programmieren Java Basics - Anfänger-Themen 3
OSchriever Jar-Programm läuft auf Windows aber nicht auf Linux(Raspberri Pi4) Java Basics - Anfänger-Themen 22
G Programm Code Java Basics - Anfänger-Themen 5
CptK Achsenskalierung in Koordinatensystem hängt Programm auf Java Basics - Anfänger-Themen 5
H Kann eine while-Schleife ein Programm blockieren? Java Basics - Anfänger-Themen 8
TimoN11 Mail Programm mit Java? Java Basics - Anfänger-Themen 1
Sajeel Chattha Dieses Programm umschreiben Java Basics - Anfänger-Themen 5
J Programm beenden ohne System.exit() oder Runtime.exit() Java Basics - Anfänger-Themen 5
F Java Programm, das kleine Buchstaben in einem String zählen soll und bei großen Buchstaben oder Sonderzeichen abbrechen soll. Java Basics - Anfänger-Themen 5
A Programm Histogram Java Basics - Anfänger-Themen 2
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
CT9288 Interaktion mit laufendem Programm -Fachbegriffe Java Basics - Anfänger-Themen 2
Gaudimagspam Assertions im Programm hinzufügen Java Basics - Anfänger-Themen 4
G Weiß jemand wie man dieses Programm schreibt? Java Basics - Anfänger-Themen 84
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
N Best Practice How can I creat a programm with java under windows 10 in order to open an spreadsheet in libreoffice calc format Java Basics - Anfänger-Themen 11
W Programm dass Palindrome erkennt Java Basics - Anfänger-Themen 6
K Erste Schritte Programm geht aus Schleife, warum? Java Basics - Anfänger-Themen 2
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
K Programm stoppt einfach ohne Grund Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben