我在子目录下有一个插件列表。我想用一个命令来构建所有这些。有一个示例目录布局。
plugins/cat/cat.go
plugins/dog/dog.go
plugins/cow/cow.go
我现在像这样构建它们:
go build -i -buildmode=plugin -o build/cat.so plugins/cat/cat.go
go build -i -buildmode=plugin -o build/dog.so plugins/dog/dog.go
go build -i -buildmode=plugin -o build/cow.so plugins/cow/cow.go
还有另一个命令(因为它在Makefile中),可以帮助我更加紧密:
# Ex.: make bin-so TARGET=cat
bin-so: builddir
go build -i -buildmode=plugin -o build/$(TARGET).so plugins/$(TARGET)/$(TARGET).go
我想创建一行来构建这些插件。我发现了如何列出文件夹名称,但是必须在上面的命令中以某种方式使用它。
find ./plugins -mindepth 1 -maxdepth 1 -type d | awk 'sub(/^.*\//, "")'
因此它将列出文件夹的名称,对我来说这是很好的,但是我必须将其重定向到插件生成器命令。
我想要类似的东西(仅作为示例):
find ./plugins -mindepth 1 -maxdepth 1 -type d | awk 'sub(/^.*\//, "")' | go build -i -buildmode=plugin -o build/$1).so plugins/$1/$1.go
答案 0 :(得分:2)
您可以使用find
选项在一个-execdir
命令中执行此操作,该选项允许您直接在文件的基本名称上运行命令
find ./plugins -mindepth 1 -maxdepth 1 -type d -execdir bash -c '
for arg; do
name="${arg##*./}"
go build -i -buildmode=plugin -o build/"${name}".so plugins/"${name}"/"${name}".go
done' _ {} +
这比在find
之后使用多个管道获得相同的结果要好得多。想象一下sh -c '..'
中的部分是一个单独的脚本,您将参数返回给脚本,其名称返回了./cow.go
等。
这里-execdir
的优点是您不必担心目录名称之前的立即路径。您将找到找到的目录的最终基本名称。
请参见Understanding the -exec option of find
on Unix.SE,以详细了解所使用的每个选项。