作業が難しい非常に大きなソースコードディレクトリ構造があります。私に合ったMaven構造に変換するツールを実行したいと思います。作業が終わったら、ツールを再実行してMaven構造を元の悪い構造に変換しました。私はさまざまなシェルに慣れていて、何百ものcpコマンドを使ってスクリプトを書くことができます。しかし、これは維持するのが難しいでしょう。
Perforceのドット3つのワイルドカードなどを使用してファイルを移動またはコピーできるようにしたいです。
現在の作業ディレクトリとすべてのサブディレクトリのすべてのファイルと一致します。 (スラッシュを含むすべてのエントリと一致し、サブディレクトリでこれを行います)
その後、私のスクリプトには次のコマンドが含まれます。
cp src/.../foobar/.../*.java trusted/src/main/java/.../foobar/.../*.java
アイデアは、サブツリーの構造を維持しながらディレクトリのサブツリーを移動することです。
どんなアイデアがありますか?
Gillesのrsyncソリューションについて質問があります。以下はテストスクリプトです。
#!/bin/bash
rm -rf source
mkdir -p source/server/src/com/bodhi/foobar/this
mkdir -p source/server/src/com/bodhi/foobar/that
mkdir -p source/server/src/com/bodhi/other
echo "Hello World" > source/server/src/com/bodhi/foobar/this/A.java
echo "Hello World" > source/server/src/com/bodhi/foobar/that/B.java
echo "Hello World" > source/server/src/com/bodhi/other/C.java
rm -rf target
mkdir -p target/foobar/src/main/java
rsync \
--include='**/foobar/**/*.java' \
--include='**/foobar/**/' \
--exclude='*' \
--prune-empty-dirs \
source/server/src/ target/foobar/src/main/java/
ベストアンサー1
このワイルドカードは、ksh93、bash ≥4.3(ツリーのディレクトリへのシンボリックリンクがない場合は≥4.0)、およびzshに存在します。スペルです**
。 ksh93では、まず有効にする必要がありますset -o globstar
。 Bashではまずshopt -o globstar
。
ls -l src/**/foobar/**/*.java
しかし、それはコピーを作成しません。ターゲットは、ワイルドカードの一致がない単一のcp
ディレクトリです。単一のコマンドを使用してファイルを別の場所にドラッグアンドドロップすることcp
はできません。cp
あなたはそれを使用することができます同期代わりに。ソースツリーのルートとターゲットツリーのルートを渡し、必要なファイルとそれを指すディレクトリのみをコピーするためのインクルードルールと除外ルールを定義します。 Rsyncは、パターンと一致する場合は空のディレクトリをコピーし、それを使用して削除することもできます--prune-empty-dirs
。
rsync --include='**/foobar/**/*.java' --include='**/' \
--exclude='*' --prune-empty-dirs \
src/ trusted/src/main/java/
使用できる別のツールは次のとおりです。公園。 paxはrsyncとは異なり、POSIXによって定義されているため標準ですが、一部のLinuxディストリビューションではデフォルトのインストールからこれを省略します(ただし常にパッケージとして提供されています)。アプローチはrsyncに似ています。.java
ファイルを含め、残りを除外します。構文は少し奇妙です。名前を変更せずにファイルを含めるためのネイティブ置換またはファイルを除外するための空の置換になる可能性があるパターン置換を指定します。 。必要に応じてターゲットに先行ディレクトリを自動的に作成します。
pax -rw -s '/\.java$/&/' -s '/.*//' src/* trusted/src/main/java/