私は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");
}
}
#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
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バージョンは問題ありません。