"find"가 일치하는 항목을 찾았는지 감지하는 관용적 방법이 있습니까? 나는 현재 사용하고 있습니다
COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then
그러나 이것은 나에게 약간 간접적인 것 같습니다. 또한 find가 일치하는 항목을 찾으면 검색을 중단하여 시간과 노력이 낭비되지 않도록 하고 싶습니다. 일치하는 파일이 있는지 알고 싶습니다.
고쳐 쓰다:나는 코드 없이 질문을 작성하는 실수를 저질렀습니다. 나는 wc -l
그것을 다른 상황에서 사용하고 어쨌든 발견된 총 파일 수를 알아야 합니다. 일치하는 항목이 있는지 테스트하는 경우에는 if [ -z $(find …) ]
.
답변1
GNU 찾기가 있다는 것을 알고 있다면 다음을 사용하십시오.-quit
첫 번째 게임이 끝나면 중지하세요.
출력 find
을 head -n 1
.find
head
wc
어느 쪽이든 문자열이 비어 있는지 테스트 할 필요는 없으며 쉘이 자체적으로 테스트할 수 있습니다.
if [ -n "$(find … | head -n 1)" ]; then …
답변2
당신은 그것을 사용할 수 있습니다-quit
첫 번째 게임 이후 작업이 중단되었습니다. 이를 다른 작업(예 -print
: )과 결합할 수 있습니다. 그렇지 않으면 아무것도 발견했는지 알 수 없습니다.
예를 들어, find ... -print -quit
첫 번째로 일치하는 파일의 경로를 인쇄한 다음 종료합니다. 또는 -printf 1 -quit
일치하는 항목이 있으면 1을 인쇄하고 일치하는 항목이 없으면 아무것도 인쇄하지 않을 수 있습니다.
find
의 종료 상태는 검색 중 오류가 발생했는지 여부를 반영하며, 발견된 항목이 있는지 여부를 반영하므로 일치하는 항목이 있는지 확인하려면 출력을 확인해야 합니다.
답변3
Exit 0은 찾기 쉽고, Exit >0은 일반적으로 오류가 있을 때만 발생하기 때문에 더 어렵습니다. 그러나 우리는 그것을 실현할 수 있습니다:
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
이 솔루션은 하위 쉘을 사용하는 것보다 성능이 더 좋습니다. false를 실행하는 것이 Dash를 실행하는 것보다 확실히 빠릅니다.
$ cat alfa.sh bravo.sh charlie.sh delta.sh
find -name non-existing-file -exec false {} +
find -name existing-file -exec false {} +
[ "$(find -name non-existing-file)" ]
[ "$(find -name existing-file)" ]
$ strace dash alfa.sh | wc -l
807
$ strace dash bravo.sh | wc -l
1141
$ strace dash charlie.sh | wc -l
1184
$ strace dash delta.sh | wc -l
1194
답변4
다음과 같이 이를 쉘 조건부로 래핑할 수 있습니다.
[ "$(find . ...)" '!=' '' ] && echo Found || echo Not found
...
일치 기준은 어디에 있습니까 -name *.txt
?
다른 예:
[ "$(find /etc -name hosts)" ] && echo True || echo False
[ ! -z "$(find /etc -name hosts)" ] && echo True || echo False