0

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

ファイル名は
「aaaaaa-bbbbbb_cccccc-ddddd_eeeee-fffff-ggggg-hhhhh.psd」の形式です。


「Aaaaaa-Bbbbbb_Ccccccc-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'`" \;

しかし、うまくいきません:

入力:

Assisted-or-Auto/Abstract-Render/assisted-or-auto_abstract-render_tiny-bubbles3.psd

出力:

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

バッククォートを削除してセミコロンを挿入すると、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

したがって、何らかの理由で、バックティックは本来行うべきことを行いません。この問題を解決する方法についてのアイデアはありますか? 参考までに、バッククォートを「 $(cmd) 」表記に置き換えると、同じ効果があります

ありがとう

4

5 に答える 5

2

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

于 2012-04-09T23:56:33.367 に答える
0

バッククォートは避けてください。これは、エスケープの問題を求めていることを意味します。

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

トラブルをあまり回避せずにネストできるを使用し、 in$()をエスケープして、呼び出しに耐えて に渡されるようにします。その時点から(コマンドを実行するためにシェルを使用すると仮定すると)、問題なく動作します。$$(command)findfind$SHELL

于 2012-04-10T01:11:17.400 に答える
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

最初の小文字の単語部分に一致するように「/」を追加しただけです(そして、sedが言っmismatched \( .. \)たので、論理的な場所に1を追加しました.

これが役立つことを願っています。

于 2012-04-09T23:55:03.007 に答える
0

これはあなたのために働くかもしれません:

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

cp実行前にコマンドを確認したい場合は、最後のパイプを省略してください| bash

于 2012-04-10T01:33:12.730 に答える
0

わずかな変動

$ 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 sed で少しきれいにすることができます

$ sed 's!(/|-|_)[a-z]!\U&!g' <<< "$input"
于 2012-04-10T00:20:57.093 に答える