2013-02-21 12 views
8

これは比較的些細なはずですが、私はずっと幸運なことなしにしばらく努力してきました。 私は多くのディレクトリを持つディレクトリを持っていますが、それぞれには独自の構造とファイルがあります。ファイルを見つけて、名前を変えてunix bash

私はすべての.javaファイルを作業ディレクトリの下にある任意のディレクトリ内で検索し、特定の名前に変更したいと考えています。 たとえば、すべてのjavaファイル "test.java"の名前を付けたいとします。

ディレクトリ構造がある場合:私は、単純に名前を変更したい

./files/abc/src/abc.java 
./files/eee/src/foo.java 
./files/roo/src/jam.java 

:もちろん

./files/abc/src/test.java 
./files/eee/src/test.java 
./files/roo/src/test.java 

、私の問題の一部は、パスがにスペースを持っているかもしれないということです Iドン。ファイル内のクラスや何かの名前を変更することを心配する必要はありません。

ディレクトリに1つ以上の.javaファイルがある場合、上書きされるか、何をするかを選択するためのプロンプトが表示されても構いません(どちらもOKですが、1より大きい各ディレクトリに

私がしようとしているもの:。

MVにみると発見、しかしとき一緒に、私はパイプ彼らは、私はそれが間違ってやっているように見える、私は彼らの現在の場所でそれらを維持することを確認したいと名前を変更して移動しません。

ありがとう、本当に助けていただきありがとうございます。

答えて

21

findのGNUバージョンは、ファイルがどこにでもあるディレクトリを変更するアクション-execdirを持っています。

find . -name '*.java' -execdir mv {} test.java \; 

findのバージョンは、あなたが仕事をして成し遂げることができ、その後-execdirをサポートしていない場合:次のようにしてみてください、(私のような)あなたのfindコマンドが-execdirをサポートしていない場合

find . -name '*.java' -exec bash -c 'mv "$1" "${1%/*}"/test.java' -- {} \; 
+0

"$ {1%/ *}"/test.java'ビットはどうすればよいですか? – dumbledad

+1

変数 '$ 1'、'% 'は、最短一致する接尾辞'/* 'を削除します - ' dirname "$ 1" 'のようにファイル名を' $ 1'から削除します。そのディレクトリ名に '/ test.java'が追加されます。 –

5

find . -name "*.java" -exec bash -c 'mv "{}" "$(dirname "{}")"/test.java' \; 
+0

これは、引用符付きのファイル名では安全です。 '-exec bash -c 'mv" $ 1 "$(dirname" $ 1 ")/ test.java' - {} \;' –

関連する問題