Como posso mover todos os arquivos de código-fonte java para seus respectivos diretórios de pacotes?

6

Eu sou novo no Linux e não sei muito sobre os comandos do Linux.

Meu cenário é que eu tenho tantos arquivos fonte java com diferentes nome do pacote em um diretório.

Eu quero mover todos esses arquivos de origem java para seus respectivos pacotes diretório.

Em qualquer arquivo fonte java, a primeira linha é a declaração do pacote, que pode ou não pode ser precedido por comentários.

Então, o que eu quero é escrever um script de shell que analise a linha do pacote para todos os arquivos .java no diretório atual e mova esse arquivo java para seu respectivo diretório de pacotes.

Situação atual:

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

O que eu quero:

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

Exemplo de arquivo fonte:

//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");    
    }
}
    
por Kashyap Kansara 13.10.2017 / 14:45

2 respostas

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
    
por RoVo 13.10.2017 / 14:50
1

Aqui está uma versão em 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)

Ele usa o analisador javalang , para analisar o código-fonte Java. Eu estava apenas interessado em como isso pode parecer. A versão bash baseada em regex da @ resposta do RoVo deve ser boa.

    
por jfs 13.10.2017 / 19:46