古いファイルの上に新しいファイルをコピーできるように、特定の文字列を含むすべてのファイルを再帰的に見つける必要があります。たとえば、
ファイルに「replace me」という文字列が含まれている場合:
ファイルのフルパスを見つけます。
/dir/of/file/filename.php /dir/of/different/file/filename.php
このファイルを新しいファイルに置き換えてください
filename.php
。
簡単に見えますが、時間だけを無駄にして進展がありませんでした。
答え1
イグナシオのソリューションwithがfind
おそらく最良の方法でしょう。レビューのすべての詳細がここに含まれています。私は具体的にはファイル(ディレクトリではない)だけを検索し、3つのステートメントをグループ化し、ORステートメントを使用してすべての名前と一致させました。
find /dir/ \
-type f \
\( -name timthumb.php -or -name thumb.php -or -name rt-timthumb.php \) \
-exec grep -q "timthumb" {} \; \
-exec cp filename.php {} \;
ただし、次のようにシェルグローブパターンを使用して見つけることもできます。
shopt -s extglob
for file in /dir/**{timthumb,thumb,rt-timthumb}.php; do
grep -q 'timthumb' "$file" && cp filename.php "$file"
done
ワイルドカードの代わりにgrepを使用して再帰的に検索することもできます。ファイルが多い場合に便利です。
grep -l -R -Z 'timthumb' /dir/**thumb.php | while read -d $'\0' file; do
cp filename.php "$file"
done
すべての場合で、「/dir/」を作業したいデフォルトパスに置き換え、「filename.php」を上書きしたいソースファイルに置き換えます。必要に応じて見積もりを受け取ります。前の例では、名前が "*thumb.php"と一致するすべてのファイルを一致させるためにショートカットを使用しました。他の例でもこれを行うことができます。検索の場合は、ORステートメント全体を括弧内に入れてを使用できます-name '*thumb.php'
。上記の例はすべて、これらの名前パターンと一致し、「timthumb」文字列を含むファイルに対してのみ機能します。
答え2
find some/dir \
-exec grep -q "replace me" {} \; \
-exec cp some/new/filename.php {} \;