Linuxでは、あるディレクトリ構造から別のディレクトリ構造に多数のファイルを移動する(Javaプロジェクトmavenify)

Linuxでは、あるディレクトリ構造から別のディレクトリ構造に多数のファイルを移動する(Javaプロジェクトmavenify)

複数のモジュールを含む大規模なJavaプロジェクトがあり、プロジェクトファイルはmodule1module2...フォルダにあります。これで、ディレクトリを maven/gradle フレンドリーなモードに再構成し、すべての .java ファイルがフォルダにあり、MODULE_NAME\src\main\java\すべての非 java ファイルがMODULE_NAME\src\main\resources\フォルダにあるようにします。

cd /home/MYUSER/oldproject
find . -type f -name *.java -print | exec `sed 's:^./\([a-z0-9\-]*\)/\(.*\)/\([a-zA-Z0-9_-]*.java\):mkdir -p /home/MYUSER/project/\1/src/main/java/\2:'`

このコマンドは必要なフォルダ(パッケージ)をうまく作成しますが、実行すると

find . -type f -name *.java -print | exec `sed 's:^./\([a-z0-9\-]*\)/\(.*\)/\([a-zA-Z0-9_-]*.java\):mv \0 /home/MYUSER/project/\1/src/main/java/\2/:'`

メッセージエラーがたくさん発生します。

mv: cannot stat 'mv': No such file or directory
mv: cannot stat '/home/MYUSER/project/module1/src/main/java/com/apackage/': No such file or directory

パッケージが存在する間、多くのファイルは単に無関係なモジュールに移動されました。

誰でもこの問題を解決するのに役立ちますか?


正規表現でより明確に表現するとs:^./\([a-z0-9\-]*\)/\(.*\)/\([a-zA-Z0-9_-]*.java\)、最初のCapture(\([a-z0-9\-]*\))はモジュールをインポートし、2番目のCapture(\(.*\))はJavaパッケージをインポートし、3番目のCapture(\([a-zA-Z0-9_-]*.java\))はクラス名を取得します。


ファイルの例のリスト:

./oldproject/module1/com/mycompany/dir1/dir2/dir3/Class1.java
./oldproject/module1/com/mycompany/dir1/dir4/Class2.java
./oldproject/module2/com/mycompany/dir5/dir6/dir7/dir8/Class3.java
./oldproject/module2/com/mycompany/dir5/dir6/File1.txt
./oldproject/module2/META-INF/File2.txt

私は彼らがそうしたい

./project/module1/src/main/java/com/mycompany/dir1/dir2/dir3/Class1.java
./project/module1/src/main/java/com/mycompany/dir1/dir4/Class2.java
./project/module2/src/main/java/com/mycompany/dir5/dir6/dir7/dir8/Class3.java
./project/module2/src/main/resources/com/mycompany/dir5/dir6/File1.txt
./project/module2/src/main/resources/META-INF/File2.txt

モジュール名 regex\([a-z0-9\-]*\) パッケージ名 (中間フォルダ) regex \([a-z0-9_]*\)(ただし、複数のネストされたパッケージである可能性があります) クラス名 regex\([a-zA-Z0-9_-]*.java\)


sed更新:コマンドを生成することは、すべてのコマンドをリンクするようですmv。これが問題です(それらの間に新しい行はありません)。したがって、execは各sedの出力を1つずつ実行しないようです。だから質問はmkdirがどのように機能するかです。

ベストアンサー1

この試み:

cd /home/MYUSER/
shopt -s globstar # required in bash for recursion, not needed by zsh
for f in **/*.java; do
    nf=$(sed 's:^oldproject/\([a-z0-9\-]*\)/\(.*\)/\([a-zA-Z0-9_-]*.java\):project/\1/src/main/java/\2/\3:' <<< "$f")
    echo install -D "$f" "$nf"
    echo rm -f "$f"
done

# clean empty dirs
#find . -type d -exec rmdir {} + 2>/dev/null
#rm -rf oldproject # or this one if it's what you need

echo試してみたら、これら2つのコマンドを削除してください。

install -D source_file dest_file必要なディレクトリ構造全体を透過的に作成しますmkdir -p

出力

install -D oldproject/module1/com/mycompany/dir1/dir2/dir3/Class1.java project/module1/src/main/java/com/mycompany/dir1/dir2/dir3/Class1.java
rm -f oldproject/module1/com/mycompany/dir1/dir2/dir3/Class1.java
install -D oldproject/module1/com/mycompany/dir1/dir4/Class2.java project/module1/src/main/java/com/mycompany/dir1/dir4/Class2.java
rm -f oldproject/module1/com/mycompany/dir1/dir4/Class2.java
install -D oldproject/module2/com/mycompany/dir5/dir6/dir7/dir8/Class3.java project/module2/src/main/java/com/mycompany/dir5/dir6/dir7/dir8/Class3.java
rm -f oldproject/module2/com/mycompany/dir5/dir6/dir7/dir8/Class3.java

おすすめ記事