我试图编写一个脚本,循环遍历目录中的每个 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 {}
需要将 的内容{}
分配给$1
not $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
的退出状态中报告。
答案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"' _ {} \;