다음 명령을 사용하여 이름에 포함된 파일 수 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.