我有一堆文件夹,其中有一个名为 360 的子文件夹。
find . -name '360' -type d -exec 'echo "{}"' \;
输出:
find: echo "./workspace/6875538616c6/raw/2850cd9cf25b/360": No such file or directory
对于每个找到的项目,我想执行一个curl 调用,并触发Jenkins 构建作业。我的问题是开头的 ./ 部分。我应该能够像这样切断它:
find . -name '360' -type d -exec 'echo {} | cut -c 2-' \;
但因为它以 ./ 开头,所以它只会被执行(“没有这样的文件或目录”)。如何在没有前导的情况下获得 find 的输出./
?
更新:
这是詹金斯卷曲调用的全部内容:
find reallylongfolderstructure -name '360' -type d -exec 'curl http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken¶meter={}' \;
输出
08:53:52 find: ‘curl http://user:token@ourdomain/jenkins/job/jobname/buildWithParameters?token=ourtoken¶meter=reallylongfolderstructure/something/lol/360’: No such file or directory
答案1
你写
因为它以 ./ 开头,所以它只会被执行(“没有这样的文件或目录”)。
这不是正在发生的事情。您已向find ... -exec
的参数提供了单个命令echo "{}"
。请注意,这不是;echo
找到的目录find
。它是一个名称中包含空格的命令。该find
命令(相当合理)无法执行名为 的命令echo "./workspace/6875538616c6/raw/2850cd9cf25b/360"
。
删除参数周围的单引号-exec
,您可能会发现不需要任何其他更改或解决方法:
find . -name '360' -type d -exec echo "{}" \;
同样,这里您需要删除传递给 的整个值的引用-exec
。但在这种情况下,您仍然需要引用存储参数,以便 shell 无法解释&
等。
find reallylongfolderstructure -name '360' -type d -exec curl 'http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken¶meter={}' \;
答案2
问题是您将实用程序名称和参数都作为单个字符串引用,这会导致find
尝试将整个内容作为命令名称执行。
而是使用
find . -type d -name '360' -exec curl "http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken¶meter={}" ';'
在 的一些较旧的实现中find
,{}
将不会被识别为find
与上面的另一个字符串连接时找到的路径名,并且您必须使用子 shell 来代替:
通过您的电话curl
:
find -type d -name '360' -exec sh -c '
for pathname do
curl "http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken¶meter=$pathname"
done' sh {} +
也可以看看:
在bash
:
shopt -s globstar
for pathname in ./**/360/; do
curl "http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken¶meter=$pathname"
done
shellglobstar
选项使**
glob 模式可用。它的工作方式类似于*
,但匹配路径名中的斜杠。