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
옵션은 **
글로벌 모드를 활성화합니다. 비슷하게 작동 *
하지만 경로 이름의 슬래시와 일치합니다.