如何将“{}”的内容分配给“find --exec”中的shell变量

如何将“{}”的内容分配给“find --exec”中的shell变量

我试图编写一个脚本,循环遍历目录中的每个 xml 文件并运行 make NAME= 其中 NM 是文件名减去.xml,我遇到困难的地方是将{}占位符分配给变量。作为

find . -iname "*.xml" -exec foo=$(echo {}); gmake NAME=$FOO \;

不起作用,因为没有分配任何内容$FOO

答案1

在 IRC 上进行了大量搜索后,有人向我指出了以下答案

find . -iname "*.xml" -exec bash -c 'echo "$1"' bash {} \;

或者对于我的例子(删除字符串以避免混淆)

find . -iname "*.xml" -exec bash -c 'gmake NAME="$1"' bash {} \;

其工作方式是 bash 将后面的参数-c作为参数,bash {}需要将 的内容{}分配给$1not $0,并bash用于填充$0。它不仅仅是一个占位符,因为它的内容$0例如用在错误消息中,所以你不想使用诸如_或之类的东西''

要每次调用处理多个文件bash,您可以执行以下操作:

find . -iname "*.xml" -exec bash -c '
   ret=0
   for file do
       gmake NAME="$file" || ret=$?
   done
   exit "$ret"' bash {} +

该方法还有一个额外的好处,即如果任何gmake调用失败,它将在find的退出状态中报告。

更多信息可以从http://mywiki.wooledge.org/UsingFind#Complex_actions

答案2

Simotek的回答太棒了!更改了格式,以便我可以在一行中重命名大量文件......

find * -name "*.sh" -exec bash -c 'OLD=$1; NEW=$(echo $OLD | sed s/OLD-NAME.sh/NEW_NAME.sh/g); mv "$OLD" "$NEW"' _ {} \;

相关内容