web-dev-qa-db-ja.com

すべてのJavaソースファイルをそれぞれのパッケージディレクトリに移動するにはどうすればよいですか?

私はLinuxが初めてで、Linuxコマンドについてあまり知りません。

私のシナリオでは、ディレクトリ内に異なるパッケージ名を持つ非常に多くのJavaソースファイルがあります。

これらすべてのJavaソースファイルをそれぞれのパッケージディレクトリに移動します。

Javaソースファイルでは、最初の行はpackageステートメントであり、コメントが先行する場合としない場合があります。

そのため、現在のディレクトリにあるすべての.Javaファイルのパッケージ行を解析し、それぞれのパッケージディレクトリにあるJavaファイルを移動するシェルスクリプトを作成します。

現在の状況:

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

私が欲しいもの:

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

ソースファイルの例:

//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");    
    }
}
7
Kashyap Kansara
#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
8
pLumo

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)

javalang パーサーを使用して、Javaソースコードを解析します。私はちょうどそれがどのように見えるか興味がありました。 @ RoVoのanswer の正規表現ベースのbashバージョンは問題ありません。

1
jfs