"찾기"에서 일치하는 항목을 발견했는지 확인하는 방법


16

"find"가 일치하는 것을 발견했는지 감지하는 관용적 수단이 있습니까? 나는 현재 사용하고 있습니다

COUNT=`find ... | wc -l`
if [ "$COUNT" -gt 0 ]; then

그러나 이것은 나에게 약간 간접적으로 보입니다. 또한 일치하는 것이 발견되면 검색을 중지하고 싶습니다. 따라서 시간과 노력을 낭비하지 않습니다. 일치하는 파일이 있는지 여부 만 알면됩니다.

업데이트 : 나는 내 앞에 코드없이 내 질문을 쓰는 실수를 저질렀다 wc -l. 어쨌든 발견 된 총 파일 수를 알아야하는 다른 경우에 사용 한다. 일치하는 항목이 있는지 테스트하는 경우을 사용했습니다 if [ -z $(find …) ].

답변:


17

GNU find가 있다는 것을 알고 있다면 -quit , 첫 번째 일치 이후에 중지하도록 사용하십시오.

이식 가능하게의 출력을 find로 파이프하십시오 head -n 1. 그런 식으로 find몇 번 일치하면 파이프가 끊어집니다 ( head입력 버퍼 가 채워진 경우 ).

어느 쪽이든, wc문자열이 비어 있는지 테스트 할 필요가 없으며 쉘은 자체적으로 수행 할 수 있습니다.

if [ -n "$(find … | head -n 1)" ]; then …

흥미 롭습니다 ... 나는 -n'정의 된'변수 ($ abc, $ xyz 등)에만 적용 되었다고 생각 했지만 $ (...)은 '정의 된'임시 변수라고 가정합니다. +1 ... (그리고 나는 단지 -n변수가 이미 선언되지 않았고 사용되지 않았다고 확신하지 않는 한, 사용 이 위험하다는 것을 최근에 읽으십시오 . 그러나 temp는이 가능성을 갖지 않습니다 ... 즉. 초기화되지 않은 vs. 비어 있음
Peter.O

2
@fred : 반대로 -n문자열이 비어 있는지 테스트하고 변수와 관련이 없습니다. 당신이 읽은 것은 아마도 사용하는 것을 말하고 있었다 -n: 변수가 정의되어 있는지 여부를 테스트하지 않는 -n "$foo"경우는 false입니다 foo정의되어 있지만 비어, 및 디스플레이에서 오류 메시지입니다 set -u. 설정 [ -n "${foo+1}" ]여부를 확실하게 테스트 foo하지만 비어 있고 설정되지 않은 변수를 동일하게 처리하는 것이 일반적으로 좋은 생각입니다. [ -n "${foo:+1}" ]또는 [ -n "$foo" ]걱정하지 않아도 set -u됩니다.
Gilles 'SO- 악마 그만해'

감사! 나는 -quit사용할 수 없지만 head -n 1작동 하기 위해 배관 작업 을 수행 합니다 head -c 1. 또한, 나는 내 앞에 코드없이 내 질문을 쓰는 실수를 저질렀다. 나는 wc -l발견 된 총 파일 수를 알아야하는 다른 경우에 사용한다 . 일치하는 항목이 있는지 테스트하는 경우을 사용했습니다 if [ -z `find … ` ].
Chris 페이지

6

-quit첫 번째 일치 후 조치를 사용하여 중지 할 수 있습니다 . 이를 다른 작업 (예 :)과 결합 -print하거나 무언가를 찾았는지 알 수 없습니다.

예를 들어, find ... -print -quit일치하는 첫 번째 파일의 경로를 인쇄 한 다음 종료합니다. 또는 -printf 1 -quit일치하는 항목이 있으면 1을 인쇄하고 일치하지 않으면 아무 것도 인쇄하지 않아도됩니다.

find의 종료 상태는 검색하는 동안 오류가 있었는지 여부를 나타내며, 아무것도 발견했는지 여부를 나타내지 않으므로 출력이 일치하는지 확인해야합니다.


-quitGNU 확장입니다. OS X, BSD 및 아마도 대부분의 상용 Unices와 같은 find (1)의 다른 구현을 사용하는 시스템에서는 작동하지 않습니다.
워렌 영

다른 시스템을 사용하는 경우 알아두면 좋습니다. 불행히도 내 -quit 또는 -printf를 사용할 수 없습니다 (Mac OS X).
Chris 페이지

4

종료 0은 찾기가 쉽고, 종료> 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

0

쉘 조건으로 랩핑 할 수 있습니다. 예 :

[ "$(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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.