find와 함께 "-exec"를 사용할 때 "해당 파일이나 디렉터리가 없습니다"

find와 함께 "-exec"를 사용할 때 "해당 파일이나 디렉터리가 없습니다"

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&parameter={}' \; 

산출

08:53:52 find: ‘curl http://user:token@ourdomain/jenkins/job/jobname/buildWithParameters?token=ourtoken&parameter=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&parameter={}' \; 

답변2

문제는 유틸리티 이름과 매개변수를 모두 단일 문자열로 인용하여 find전체 항목을 명령 이름으로 실행하려고 한다는 것입니다.

대신 사용

find . -type d -name '360' -exec curl "http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken&parameter={}" ';' 

일부 이전 구현에서는 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&parameter=$pathname"
    done' sh {} +

또한보십시오:


존재하다 bash:

shopt -s globstar

for pathname in ./**/360/; do
    curl "http://user:[email protected]/jenkins/job/jobname/buildWithParameters?token=ourtoken&parameter=$pathname"
done

globstar옵션은 **글로벌 모드를 활성화합니다. 비슷하게 작동 *하지만 경로 이름의 슬래시와 일치합니다.

관련 정보