2012-04-09 7 views
0

名前を変更したいディレクトリ構造に多数のファイルがあります。バックティックが動作しない

ファイル名がこの形式である:
"AAAAAA-bbbbbb_cccccc-ddddd_eeeee-FFFFF-GGGGG-hhhhh.psd"

私はこの形式でそれらをしたい:
「AAAAAA-Bbbbbb_Cccccc-Ddddd_Eeeee-FFFFF -Ggggg-Hhhhh.psd

単一のfindとsedのルーチンが正しい形式にそれらを変換する必要があります。

find . -name "*psd" -exec sh -c "echo 'cp '{} `echo {} | sed 's/\([_-][a-z]\)\([A-Z]*\)/\2\U\1/g'`" \; 

しかし、それは動作しません:

入力:

アシストまたはオート/抽象レンダリング/アシスト又は-auto_abstract-render_tiny-bubbles3.psd

出力:

CP ./Assisted-or-Auto/抽象レンダリング/アシスト/アシスト/オートアブストラクトレンダリングタイニーバブル3.psd ./Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd

sedルーチンは、セミコロンを挿入してください。

find . -name "*bubbles3.psd" -exec sh -c "echo 'cp '{} ; echo {} | sed 's/\([_-][a-z]\([A-Z]*\)/\2\U\1/g'" \; 

cp ./Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd 
./Assisted-Or-Auto/Abstract-Render/assisted-Or-Auto_Abstract-Render_Tiny-Bubbles3.psd 

何らかの理由で、バックティックは何をすべきかをしていません。どのように私はこの問題を解決することができます上の任意のアイデア? はFYI表記が同じ効果を有する

おかげ

答えて

0

sed 's/\([/_-][a-z]\)\([A-Z]*\)/\2\U\1/g' 

すなわち

echo $'./Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd' \ 
| sed 's/\([/_-][a-z]\)\([A-Z]*\)/\2\U\1/g' 

出力

./Assisted-Or-Auto/Abstract-Render/Assisted-Or-Auto_Abstract-Render_Tiny-Bubbles3.psd 
を試みる "$(CMD)" とバッククォートを置き換えます

最初の小文字の単語部分に一致するように '/'を追加しました(と私のsedはmismatched \(.. \)と言っていますので、論理的な場所に1を追加しました。

こちらがお役に立てば幸いです。

2

ほとんどの場合、シェルはバックチック内のコマンドを最初に(findを実行する前でも)解釈しています。しかし、 "{}"は、の後には、findの実行後に特別な意味を持ちません。インラインで記述するのではなく、コマンドのシェル関数またはbashスクリプトを作成してみてください。シェルエスケープの問題を心配することなく、より複雑なことを行えるはずです。

$ input=Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd 
$ sed 's!\(/\|-\|_\)[a-z]!\U&!g' <<< "$input" 
Assisted-Or-Auto/Abstract-Render/Assisted-Or-Auto_Abstract-Render_Tiny-Bubbles3.psd 

はGNUと少しクリーナーを行うことができ

0

わずかな変化がそれはあなたが問題を脱出するために求めているの手段として

$ sed 's!(/|-|_)[a-z]!\U&!g' <<< "$input" 
0

は、バッククォートを避けるのsed。

すでに指摘したように、バックチックはfindの呼び出しの前に有効になる可能性があります。

多くの問題をエスケープせずにネストし、それが呼び出しを生き残るとfindに渡されるように$(command)$を脱出することができます使用$()、。その時点から(例えば、findがシェルを使用していると仮定すると、コマンドを実行するには$SHELL)、問題なく動作します。

0

これはあなたのために働くかもしれません:あなたは実行前にcpコマンドを参照したい場合は、

find . -name "*bubbles3.psd" | 
sed 'h;s/\(^\|[/_-]\)./\U&/g;H;g;s/^/cp -v /;s/\n/ /' | 
bash 

をちょうど最後のパイプをオフのままに| bash

関連する問題