我是Linux新手,对Linux命令了解不多。
我的情况是,我在一个目录中有许多具有不同包名的 java 源文件。
我想将所有这些 java 源文件移动到它们各自的包目录中。
在任何 java 源文件中,第一行都是包语句,其前面可能有或可能没有注释。
所以我想要编写一个 shell 脚本,解析当前目录中所有 .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");
}
}
答案1
#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
答案2
以下是 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)