Wie kann ich alle Java-Quelldateien in das jeweilige Paketverzeichnis verschieben?

7

Ich bin neu in Linux und weiß nicht viel über Linux-Befehle.

Mein Szenario ist, dass ich so viele Java-Quelldateien mit unterschiedlichen Paketnamen in einem Verzeichnis habe.

Ich möchte alle diese Java-Quelldateien in ihr jeweiliges Paketverzeichnis verschieben.

In jeder Java-Quelldatei ist die erste Zeile eine Paketanweisung, der möglicherweise ein Kommentar vorangestellt ist oder nicht.

Ich möchte also ein Shell-Skript schreiben, das die Paketzeile für alle Java-Dateien im aktuellen Verzeichnis analysiert und diese Java-Datei dann in das entsprechende Paketverzeichnis verschiebt.

Momentane Situation:

directory1
|- Class1.java (package : com.pkgA)
|- Class2.java (package : com.pkgB)
|- Class3.java (package : com.pkgC.subpkg)

Was ich möchte:

directory1
|- src
   |- com
      |- pkgA
         |- Class1.java
      |- pkgB
         |- Class2.java
      |- pkgC
         |- subpkg
            |- Class3.java

Beispielquelldatei:

//This is single line comment
/* This is multi line comment
 * Any of these style comment may or may not be present
 */

package com.pkgA;

public class Class1 {
    public static void main(String[] args) {
        System.out.println("Hello");    
    }
}
Kashyap Kansara
quelle

Antworten:

8
#Loop through the java files
for f in *.java; do

    # Get the package name (com.pkgX)
    package=$(grep -m 1 -Po "(?<=^package )[^; ]*" "$f")

    # Replace . with / and add src/ at the beginning
    target_folder="src/${package//./\/}"

    # Create the target folder
    mkdir -p "$target_folder"

    # move the file to the target folder
    mv "$f" "$target_folder"

done
pLumo
quelle
Es funktioniert wie erwartet perfekt. Du bist ein Genie. Danke ... danke ... so sehr.
Kashyap Kansara
1

Hier ist eine Python-Version:

#!/usr/bin/env python3
from pathlib import Path
from javalang.parse import parse  # $ pip install javalang

for java_src_path in Path().glob('*.java'):
    tree = parse(java_src_path.read_text())
    package_path = Path('src', *tree.package.name.split('.'))
    package_path.mkdir(parents=True, exist_ok=True)
    java_src_path.replace(package_path / java_src_path.name)

Es verwendet javalangParser, um Java-Quellcode zu analysieren. Ich war nur interessiert, wie es aussehen könnte. Die Regex-basierte Bash-Version aus der Antwort von @ RoVo sollte in Ordnung sein.

jfs
quelle
Ich kann leicht Quelldateien finden, die den Code von @ RoVo beschädigen, aber mit Ihrem in Ordnung sein sollten, daher ist dies definitiv eine wertvolle Ergänzung zu dieser Frage.
Jörg W Mittag