どうですか:
for file in *.php3
do
sed 's/\.php3/.php/g' $file > ${file%3}
done
for/do/done ループは、各 .php3 ファイルを順番に処理し、ファイルを編集して各文字列.php3
を.php
に置き換え、something.php3 から something.php にファイルをコピーします。
修正された質問に追加:
for file in $(find . -type f -name '*.php3' -print)
do
sed 's/\.php3/.php/g' $file > ${file%3}
done
' -print
' は最近では通常省略できますが、歴史的には、もともと (POSIX より前の) デフォルト アクションがなかったため、追加するのを忘れた人々によって多くのマシン時間が浪費されていました。
このフラグメントは、拡張タスクを実行するための元のコードの最も単純な変更に関するものですが、それを実行するための最良の方法であるとは限りません。ファイルを処理する前に、ファイルのリスト全体を事前に生成します。代わりに次を使用できます。
find . -type f -name '*.php3' -print |
while read file
do
sed 's/\.php3/.php/g' $file > ${file%3}
done
ただし、ファイル名またはパス名に空白や改行などの文字が含まれている可能性がある場合、修正されたバージョンはどちらも問題が発生する可能性があります。このような問題を回避するには、Perl や (GNU find + xargs) などの手法を使用して、より多くの作業を行う必要があります。あなたが正気であれば、そのような問題を避けることができます。完全に正気とは言えないセットアップを継承した場合は、Unix のファイル名処理の奥深さを深く掘り下げる必要があるかもしれません。