如何将参数与“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"'

相关内容