Je suis nouveau sur Linux et je ne connais pas grand chose aux commandes linux.
Mon scénario est le suivant: j'ai tellement de fichiers source Java avec un nom de package différent dans un répertoire.
Je souhaite déplacer tous ces fichiers source Java vers leur répertoire de package respectif.
Dans tout fichier source Java, la première ligne est une instruction de package, qui peut être précédée ou non de commentaires.
Donc, ce que je veux, c'est écrire un script Shell qui analyse la ligne de paquet pour tous les fichiers .Java du répertoire courant, puis déplace ce fichier Java dans son répertoire de paquetage respectif.
Situation actuelle:
directory1
|- Class1.Java (package : com.pkgA)
|- Class2.Java (package : com.pkgB)
|- Class3.Java (package : com.pkgC.subpkg)
Ce que je veux:
directory1
|- src
|- com
|- pkgA
|- Class1.Java
|- pkgB
|- Class2.Java
|- pkgC
|- subpkg
|- Class3.Java
Exemple de fichier source:
//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");
}
}
#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
Voici une version Python:
#!/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)
Il utilise javalang
un analyseur, pour analyser le code source Java. Je voulais juste savoir à quoi ça pourrait ressembler. La version bash de regex de @ la réponse de RoVo devrait bien se passer.