フォルダ構造があります
conf/
widget1/
env1.cfg
env2.cfg
widget2/
env1.cfg
env2.cfg
widget3/
env1.cfg
env2.cfg
widget4/
env1.cfg
env2.cfg
...
私がやりたいことは、名前付きのすべてのファイルを見つけて名前付きenv2.cfg
ディレクトリにコピーを作成することですenv3.cfg
。
私は試した:
find -name env2.cfg -exec cp '{}' "env3.cfg" ";"
しかし、ちょうどディレクトリenv3.cfg
に作成されました。conf/
どんなアイデアがありますか?
明確にするために、Mac OSXでこれを行っていますが、可能であればCentOSでも同じコマンドを実行するのが理想的です。
答え1
努力する
find . -name env2.cfg -execdir cp {} env3.cfg \;
exec
に置き換えると、execdir
「アクション」()がファイル()を含むフォルダ内でcp
発生することを意味します。env2.cfg
答え2
例では、すべてのenv2.cfgファイルを現在の作業ディレクトリ「.」にコピーします。見つかったファイルには、そのディレクトリを含む新しい名前を指定する必要があります。これは私にとって効果的です。
for file in $(find . -name env2.cfg); do backup=$(echo $file | sed 's/env2.cfg/env3.cfg/'); cp $file $backup; done
編集:または複数のコマンドを使用して気にする必要がない、よりエレガントな方法です。
for file in $(find . -name env2.cfg); do cp $file ${file/env2/env3}; done
答え3
静的構造なので、ファイル名を直接指定し、シェルにそれをコピーさせることができます。
for f in conf/widget*/env2.cfg
do
cp "${f}" "${f/env2/env3}"
done