2011-11-09 26 views

答えて

1

/dirとまではい、単にCD:

ディストリビューションに依存し
find -depth -type d -execdir rename 's/_/ /g' {} \; 

、あなたはperlの名前の変更(時々prename)が必要です。

file $(type -p rename) 

出力が悪く見えること、ELFが含まれている場合;)

編集 -depthと-execdirは-execdirを使用しています答えは簡単ですが、唯一の意志

+1

「foo_barは/ baz_quuxは」find' 'によって出力される前に、「foo_barは」が見つかりと名前が変更されますので、これは動作しません - 後者はしません名前の変更が試行されたときに検出されます。 –

+0

大したことではなく、 '-depth'スイッチを追加して見つけることができます。 –

+0

はい、-depth added;) –

6

を追加しましたPOSIX only specifies -exec以降、findのバージョンで、-execdir(GNU findなど)をサポートしています。

bashを使いたいのであれば、findが検索しているディレクトリの名前を変更するので、これは驚くほど難しいことです。あなたが注文権を得たとしても、find-depthオプションを使用して、パスの最後のコンポーネントだけをそれぞれ-execに書き換えるようにする必要があります。次はone of the examples given in the Bash FAQの些細な変化であると私のためにOKに動作するようです:

find . -depth -name "*_*" -exec bash -c 'dir=${1%/*} base=${1##*/}; mv "$1" "$dir/${base//_/ }"' _ {} \; 

よくある質問の答えは、再帰的に関心のあるフォルダに名前を付けるの問題の詳細な議論をしていること。


更新:そのワンライナーはかなり複雑であるので、それは説明の利益のために少しそれを破壊する価値があるかもしれません。基本的に、findコマンドは次のとおりです。

つまり
find . -depth -name "*_*" -exec bash -c [SOME-STUFF] _ {} \; 

、アンダースコアが含まれている、このような各ディレクトリのために、最も深いで始まるすべてのディレクトリを見つけ、(_としてパラメータ0で、bashスクリプトを実行します[SOME-STUFF]それを気にしないことを示すため)、見つかったファイルの名前としてパラメータ1を使用します。 (find-exec{}のファイル名に置き換えます\;をちょうど-exec実行するコマンドを終了します。)

を次に[SOME-STUFF]部分がで構成されています

dir=${1%/*} 

... parameter expansionを使用しています、 (ファイル名)の末尾から/*の最短一致を削除し、結果にdirを設定します。同様に、この部分は:

base=${1##*/} 

... $1の開始から*/の最長一致を削除し、その結果にbaseを設定します。したがって、baseはパスの最後のコンポーネントに過ぎません。再度、パラメータ展開、${parameter/pattern/string}構文を使用して、この時間を利用し

mv "$1" "$dir/${base//_/ }" 

その後、名前の変更は、実際にあるmvコマンドによって行われます。ファイル名($1)の名​​前が$dirに変更され、その後に$baseが追加されますが、$baseのアンダースコアはスペースで置き換えられます。

+0

置き換えの値(この場合のスペース)を呼び出し元のスクリプトからの変数にしたい場合はどうすればよいですか?例: $ SOMEVARは動作しません。見つける。 -depth -name "* _ *" -exec bash -c 'dir = $ {1%/ *} base = $ {1 ## * /}; mv "$ 1" "$ dir/$ {base // _/$ SOMEVAR}" '_ {} \; –

0

あなたはbash4を持っている場合は、あなたが実行することができます:

for i in **; do [[ -d "$i" ]] || continue; mv "$i" "${i/_/ }"; done 
関連する問題