2016-10-21 15 views
0

ファイルの名前を正確にはわからないファイルの名前を変更し、拡張子を保持する必要があります。ファイルの名前を変更し、拡張子をbashに保存します

例:ファイルsystem.earするシステム2.1.3.war、システム2.1.3.ear、システム2.1.3.ejb 、system.war、system.ejb

だから私が書きましたこの。

問題は次のとおりです。「検索」コマンドの「リスト」内の最後のファイルに対してのみ機能します。したがって、ファイルがsystem-2.1.3.ejbであれば、system-2.1.3.warとsystem-2.1.3.earは動作しません。私は.earのは今最後のものである*

find /DIR1 -name "*.ejb" -o -name "*.war" -o -name "*.ear" 

Noticeを検索を変更すると、それはシステム2.1.3.earのためではなく、他人のためにというように動作します

この問題を解決してください。

私はそれを達成するためのスクリプトを作成できますが、私は "1行"コードが欲しいと思います。

答えて

3

むしろスクリプトで{}を埋め込むよりも、引数として渡す:\(...\)グループ化せずに

find /DIR1 \(-name "*.ear" -o -name "*.war" -o -name "*.ejb" \) \ 
    -exec sh -c 'ext=${1##*.}; cp "$1" "NEW_NAME.$ext"' _ '{}' \; 

-execは以前のものと、それは暗黙のうちにある主「と」EDに適用されます。

ます。また、複数の引数をループでシェルへのコール数を制限することができます。

find /DIR1 \(... \) -exec sh -c 'for f; do ext=${f##*.}; cp "$f" "NEW_NAME.$ext"; done' _ {} + 
+0

を私は、私のコードと作品のおかげで、\(\)を追加します。しかし、なぜcp "$ 1" "NEW_NAME。$ ext"が既に仕事をしているのなら "_ '{}'"を使うのですか? –

+0

'-c'の引数は実行するスクリプトですが、引き続き展開するために' $ 1'の引数を渡す必要があります。これにより、 'cp'に渡された引数が適切に引用されるようにするのが容易になります。 – chepner

3

これを試してください。

find /DIR1 \(-name "*.ear" -o -name "*.war" -o -name "*.ejb" \) -exec bash -c 'export var1={}; cp $var1 NEW_NAME${var1: -4}' \; 

又は

find ./DIR1/ -regex '.*\(.ear\|.war\|.ejb\)$' -exec bash -c 'export var1={}; cp $var1 NEW_NAME${var1: -4}' \; 

例:。

[email protected] $ ls -arlt DIR1/ 
total 76 
-rw-rw-r-- 1 user user  0 Oct 21 22:59 system-2.1.3.war 
-rw-rw-r-- 1 user user  0 Oct 21 22:59 system-2.1.3.ear 
-rw-rw-r-- 1 user user  0 Oct 21 22:59 system-2.1.3.ejb 
drwxrwxr-x 2 user user 4096 Oct 21 22:59 . 


[email protected] $ find . \(-name "*.ear" -o -name "*.war" -o -name "*.ejb" \) -exec bash -c 'export var1={}; cp $var1 NEW_NAME${var1: -4}' \; 

[email protected] $ ls -ralt 
total 76 
-rw-rw-r-- 1 user user  0 Oct 21 22:59 system-2.1.3.war 
-rw-rw-r-- 1 user user  0 Oct 21 22:59 system-2.1.3.ear 
-rw-rw-r-- 1 user user  0 Oct 21 22:59 system-2.1.3.ejb 
drwxrwxrwt 11 root root 69632 Oct 21 23:10 .. 
-rw-rw-r-- 1 user user  0 Oct 21 23:10 NEW_NAME.war 
-rw-rw-r-- 1 user user  0 Oct 21 23:10 NEW_NAME.ear 
-rw-rw-r-- 1 user user  0 Oct 21 23:10 NEW_NAME.ejb 
drwxrwxr-x 2 user user 4096 Oct 21 23:10 . 
1

私はwhileを使用したい:

find . -name "*.war" -o -name "*.ejb" -o -name "*.ear" | while read file; do cp $file NEW_NAME${file: -4}; done 

*.ejb、複数の*.warを持っているので、もしこれとあなたの例の両方が、現在のディレクトリ内のファイルをコピーしていることに注意してくださいまたはあなたのツリーには*.ear、最後のものだけがターゲットディレクトリに残されます。

1

あなたがrename有用性を持っているなら、あなたは、ファイルごとにBASHのサブプロセスをフォーク避け、また、正規表現機能を利用することができますfindに複数-nameオプション避けるために:

find /DIR1 -regextype awk -regex '.*\.([we]ar|ejb)$' \ 
    -exec rename 's/.*(\.[^.]+)$/system$1/' '{}' + 
関連する問題