別のフォルダにファイルがあります(ファイル拡張子.mvw)。各フォルダに移動して、「D3PLOT_1DForce」文字列(* .mvwファイルにあります)をフォルダ名に置き換えるスクリプトを作成したいと思います。
フォルダ構造は次のとおりです -
- XYZ_DV_L02_P01
- XYZ_DV_L02_P02
- XYZ_DV_L02_P03
私は次のスクリプトを書いた -
#!/bin/sh
for ii in XYZ_DV_L02* ; do
(cd "$ii")
find . -iname "*.mvw" -type f -exec sed -i "s/D3PLOT_1DForce_EffPlStrainMax_VonMisesMax/"${ii}"/g" "{}" \;
done
動作し、文字列をフォルダ名に変更しますが、すべてのファイルの最初のフォルダ名を変更します。私はsedがforループに入るとは思わない。
sedがループで動作し、ファイル内の文字列をそのフォルダ名に置き換えるにはどうすればよいですか?
ベストアンサー1
このcd
コマンドはサブシェルで実行されるため、実際には何もしません。したがって、find
コマンドは、.txtの各サブディレクトリ名に対して一度だけ親ディレクトリで実行されますXYZ_DV_L02*
。最初の呼び出しはsed
すべてのファイルの文字列を変更し、その後の呼び出しはsed
文字列を見つけることができませんが、とにかく実行されます。
この試み:
#!/bin/sh
for ii in XYZ_DV_L02* ; do
find "$ii" -iname "*.mvw" -type f -exec sed -i "
s/D3PLOT_1DForce_EffPlStrainMax_VonMisesMax/${ii}/g" "{}" +
done
編集してくれたStéphane Chazelasに感謝します。
質問のコマンドをコピーしてパスだけfind
を変更しましたが、変更を説明する価値があります。
${ii}
以前は引用されていませんが、今では引数全体を囲む引用の一部ですsed
。+
代わりに、各ファイルに対して1つのコマンドではなく、複数のファイルに対して1つのコマンドが実行され\;
ます。find
sed
編集する
コメントリクエストでは、コレクション内のすべてのシーケンス[-_a-zA-Z0-9]
と拡張子を含むファイル名である代替.h3d
テキストが後に置き換えられます.mvw
。これが私がコメントを理解する方法ですが、うまくいかないようです。パターンのテキストにアクセスするには、を使用できます\1
。特定の要件に合わせてこのキットを調整する必要があるかもしれません。
#!/bin/sh
for ii in XYZ_DV_L02* ; do
find "$ii" -iname "*.mvw" -type f -exec sed -i -r "
s/([-_a-zA-Z0-9]+)\.h3d/${ii}.h3d/g" "{}" +
done