
360というサブフォルダを含む複数のフォルダがあります。
find . -name '360' -type d -exec 'echo "{}"' \;
出力:
find: echo "./workspace/6875538616c6/raw/2850cd9cf25b/360": No such file or directory
見つかったプロジェクトごとにカール呼び出しを実行し、Jenkinsビルド操作をトリガーしたいと思います。私の問題は最初に./部分です。次のように切り取ることができるはずです。
find . -name '360' -type d -exec 'echo {} | cut -c 2-' \;
しかし、./で始まるので、単に実行されます(「そのファイルやディレクトリはありません」)。プリアンブルなしでfind出力をどのように取得できますか./
?
修正する:
以下はJenkinsカールコールの完全な内容です。
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
。ただし、この場合でも、シェルがそれを解釈できないように保存されたパラメータを引用する必要があります&
。
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
電話で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
シェルglobstar
オプションは**
グローバルモードを有効にします。同様に動作します*
が、パス名のスラッシュと一致します。