
CentOSで特定のパターンに一致するファイルを置き換えようとすると機能しません。
私はもともと次のように書きました。
cp example.com/(*)/orm-mysql/build/conf/(*)-conf.live.php example_dev.com/$1/orm-mysql/build/conf/$1-conf.live.php
example_dev.com
ディレクトリ内のファイルを.txtの同じ名前のファイルに置き換えたいと思いますexample.com
。
*ファイルの前に最初のワイルドカード値が付いています。で終わるまで、パターンはexample.com/
何でも構いません。/orm-mysql/build/conf/
-conf.live.php
私は次find
を使用しようとしていますexec
:
find /var/www/html/example.com -name '*/orm-mysql/build/conf/*-conf.live.php' -exec echo {} \;
しかし、エラーが発生します。
find:警告:Unixファイル名には通常スラッシュは含まれていません(パス名には含まれています)。これは、-name '*/orm-mysql/build/conf/*-conf.live.php'がこのシステムで常にfalseと評価できることを意味します。 「-wholename」テストがより役に立つか、「-samefile」テストがより便利です。または GNU grep を使用している場合 'find... -print0 | grep -FzZ '*/orm-mysql/build/conf/*-conf.live.php' を使用できます。
-name
パスではなくファイルのためだと思います。
どうすればいいですか?シェルスクリプトを書くよりも簡単な方法はありますか?
いくつかの例:
/var/www/html/example.com/video/orm-mysql/build/conf/video-conf.live.php
/var/www/html/example.com/images/orm-mysql/build/conf/images-conf.live.php
/var/www/html/example.com/audio/orm-mysql/build/conf/audio-conf.live.php
以下を置き換えます。
/var/www/html/example_dev.com/video/orm-mysql/build/conf/video-conf.live.php
/var/www/html/example_dev.com/images/orm-mysql/build/conf/images-conf.live.php
/var/www/html/example_dev.com/audio/orm-mysql/build/conf/audio-conf.live.php
答え1
実際にこれを行うには、シェルループを使用します。
for dir in example.com/*; do
prefix=${dir##*/}
cp "$dir"/orm-mysql/build/conf/"$prefix"-conf.live.php \
example_dev.com/"$prefix"/orm-mysql/build/conf/$1-conf.live.php
done
ターゲットディレクトリが存在しない場合はエラーが報告されますが、ターゲットディレクトリが存在する場合は期待どおりに機能します。苦情を避けるには、次の方法を使用します。
for dir in example.com/*; do
prefix=${dir##*/}
target=example_dev.com/"$prefix"/orm-mysql/build/conf/
if [ -d "$target" ]; then
cp "$dir"/orm-mysql/build/conf/"$prefix"-conf.live.php "$target"
fi
done