sh 파일의 -name 옵션과 함께 명령 find가 작동하지 않습니다.

sh 파일의 -name 옵션과 함께 명령 find가 작동하지 않습니다.

다음 명령을 사용하여 이름에 포함된 파일 수 sv또는 json원격 서버의 특정 디렉터리에 있는 파일 수를 검색합니다.

nbs_files=`ssh -q -i ${sshkey} ${user}@${server} "find ${path}/ -maxdepth 1 -mindepth 1 -type f -name '*sv*' -o -name '*.json' -exec basename {} \; | wc -l"` 

이 명령은 파일 수만 반환 .json하며, sv해당 이름에 포함된 파일은 ${path}.

해당 부분을 제거하면 -o -name '*.json'명령이 제대로 실행되고 이름에 "sv"가 포함된 파일 수를 반환합니다.

sv이름에 포함된 파일과 확장자를 가진 파일을 검색하도록 명령을 수정하는 방법을 아는 사람이 있습니까 .json?

답변1

문제는 find표현식에서 and/or 연산자의 우선순위입니다. 특히 인접한 테스트 간의 암시적 AND는 -o두 개의 명명된 테스트 간의 OR( ) 보다 우선합니다 . 따라서 테스트 표현식은 다음과 같이 구문 분석됩니다.

    -maxdepth 1 -mindepth 1 -type f -name '*sv*'
OR
    -name '*.json' -exec basename {} \;

...그리고 이는 -name '*.json'고유하고 동일한 분기의 일부 이므로 json 파일에 대해서만 실행됩니다 -exec.-exec

해결책은 테스트 주위에 명시적인 대괄호를 사용하여 일반적인 우선 순위를 재정의하는 것입니다 -name.

nbs_files=$(ssh -q -i ${sshkey} ${user}@${server} "find ${path}/ -maxdepth 1 -mindepth 1 -type f '(' -name '*sv*' -o -name '*.json' ')' -exec basename {} \; | wc -l")

그런데, 나는 또한 백틱을 다음과 같이 자유롭게 교체했습니다.$( ) . 이는 더 현대적인 옵션이고 읽기 쉬우며 백틱에 있는 이상한 이스케이프 예외가 없습니다. 바라보다이 문제그리고배쉬 FAQ #82.

관련 정보