!["find -exec"にパラメータを使用する方法は? [コピー]](https://linux33.com/image/32727/%22find%20-exec%22%E3%81%AB%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%AF%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
ディレクトリ内のすべての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"'