ワイルドカード検索とCPの交換

ワイルドカード検索とCPの交換

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

おすすめ記事