"find -exec"にパラメータを使用する方法は? [コピー]

"find -exec"にパラメータを使用する方法は? [コピー]

ディレクトリ内のすべてのPHPスクリプトに対して静的HTMLファイルを生成しようとしています。

find . -name "*.php" -exec php {} > {}.html \;

しかし、すべての結果を{}.html。ファイル名から「.php」を削除するには?

答え1

これはより効率的で移植可能な方法でなければなりません。

find . -name "*.php" -exec sh -c \
   'for i; do php "$i" > "$(dirname "$i")/$(basename "$i" .php).html"; done' sh {} +

あるいは、Stephane Chazelasのコメントのおかげで、より簡単で移植性が向上しました。

find . -name "*.php" -exec sh -c \
   'for i do php "$i" > "${i%.*}.html"; done' sh {} +

後者はまた、Stephaneが指摘した奇妙なディレクトリ名の問題を解決します。

答え2

rename非常に読みやすいソリューションです。

shopt -s extglob
rename --no-act --verbose 's/php$/html/' /path/to/parent/dir/**/*.php

--no-actよさそうな場合は削除してください。

答え3

知っていた

find . -name "*.php" | sed "s/\.php//" | xargs -i sh -c 'php "{}.php" > "{}.html"'

関連情報