일치하는 파일이 없으면`find`가 0이 아닌 값을 반환하도록 할 수 있습니까?


46

/tmp이라는 파일이없는 경우에도 something검색 find하면 0이 반환됩니다.

  $ find /tmp -name something 
  $ echo $?
  0

find아무것도 찾지 못하면 0이 아닌 종료 상태를 얻는 방법은 무엇입니까?

답변:


44

여기에 내가 원하는 것을 한 줄짜리 라이너가 있습니다.

find /tmp -name something | egrep '.*'

반환 상태는 0무언가가 발견 될 때, 그렇지 않으면 0이 아닙니다.

find추가 처리 를 위해 출력을 캡처 해야하는 경우 Sven의 답변이 그 내용을 다룹니다.


14
후행 *egrep정규식은 완전히 중복이다. egrep정규식 구문을 사용하지 않기 때문에 평범한 오래된 grep것이 몇 마이크로 초 더 빠를 수 있습니다.
tripleee

나는 사용법을 배웠다find ... | read
Sam

14

인쇄되지 않지만 결과가 발견되면 0을 종료하는 가장 간단한 솔루션

find /tmp -name something | grep -q "."

2
큰 따옴표는 여기에 목적이 없습니다.
haridsv

큰 따옴표는 코드 기능을 제공하지 않지만 마침표 문자는 디렉토리가 아닌 정규 표현식이라는 것을 독자에게 명확하게 만듭니다.
Dharma Bellamkonda

13

종료 0은 찾기가 쉽고, 종료> 0은 일반적으로 오류가 발생하기 때문에 더 어렵습니다. 그러나 우리는 그렇게 할 수 있습니다.

if find -type f -exec false {} +
then
  echo 'nothing found'
else
  echo 'something found'
fi

2
내가 알 수있는 한, 이것은 작동하지 않습니다. 의 종료 코드는 실행 한 종료 코드에 find의존하지 않는 것 같습니다 -exec.
Chris

@Chris는 나를 위해 일했고, 4 명은 투표했습니다
Steven Penny

이 솔루션의 잘못된 결과에 대한 예 : find / existing-starting-point / non-existing-starting-point -name file-in-existing-starting-point -exec false {} +
Gerald Schade

2
이것은 올바르게 작동하며 문서화되어 있습니다 ( exec반환 값이 아닌 섹션에 숨겨져 있음 ). 발견되지 않은 것을 구별 할 수 없으며 오류가 발생한 것을 발견합니다 (예 : 존재하지 않는 시작점에서 호출 된 경우).
Tgr

이 기능이 필요한 경우-예
Gerald Schade

7

Puppet 관련 문제를 해결하는 방법을 찾으려고 노력하면서 (디렉토리 자체가 아닌 디렉토리 아래의 폴더에 대한 권한 변경)이 작동하는 것 같습니다.

! test -z $(find /tmp -name something)

내 구체적인 사용 사례는 다음과 같습니다.

! test -z $(find /home -mindepth 1 -maxdepth 1 -perm -711)

find 명령이 필요한 권한을 가진 파일을 찾지 못하면 코드 1을 종료합니다.


여기에 몇 가지 솔루션 (모두 시도하지는 않음)이 Mac에서 작동하지 않았습니다. 이했다.
Alex Hall

5

불가능합니다. 파일을 찾지 못한 경우에도 파일이 성공적으로 종료되면 Find에서 0을 반환합니다 ( 파일이 실제로 존재하지 않을 때 오류를 나타내지 않는 올바른 결과 ).

찾기 맨 페이지를 인용하려면

종료 상태

모든 파일이 성공적으로 처리되면 상태 0으로 종료를 찾고 오류가 발생하면 0보다 큽니다. 이것은 의도적으로 매우 광범위한 설명이지만 반환 값이 0이 아닌 경우 찾기 결과의 정확성에 의존해서는 안됩니다.

달성하고자하는 것에 따라 -print파일 이름을 찾아 출력에 대해 테스트 할 수 있습니다 .

#!/bin/bash
MYVAR=`find . -name "something" -print`
if [ -z "$MYVAR" ]; then
    echo "Notfound"
else
   echo $MYVAR
fi

원하는만큼 강력하지는 않지만 확실히 가능합니다 .
Ruslan

매뉴얼 페이지의 구성이 잘못되었습니다. Ruslan이 말한 내용은 exec/ execdir옵션 아래에 설명되어 있습니다 (와 함께 사용 +) :If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
Tgr

1

이것이 가장 간결하고 직접적인 방법이라고 생각합니다.

test `find /tmp/ -name something -print -quit 2>/dev/null`

2
이 경우 find에 오류가 있으면 결과를 / dev / null에 인쇄하고 0이 아닌 종료를 반환 한 다음 test 명령으로 0으로 고정합니다.
Jeff Ferland

나는 그것이 사실이라고 믿지 않습니다. 예를 설명하십시오. 오류가 있고 종료를 찾으면 문자열이 비어 있고 테스트에서 0이 아닌 값을 반환합니다.
danorton

귀하의 예가 무엇인지 잘 모르겠지만 실수로 생략 -print -quit하여 귀하의 우려를 해결할 수 있습니다.
danorton

아마도 다운 보트를 한 다른 사람 (아마도 같은 이유로)이 반대의 예를 제공 할 수 있습니까?
danorton

1
좋아, 당신은 내 스타일을 좋아하지 않아. 내 유스 케이스의 경우 발견 된 오류는 소음이 있거나 심각하여 다른 곳에서 나타날 수 있습니다. 어쨌든이 방법은 궁극적 인 질문에 정확하게 대답합니다. "경로에 지정된 이름으로 액세스 가능한 파일이 있습니까?" 오류는 "아니오"의 정답을 반환합니다. 왜 그렇지 않은지 알고 싶다면 여기에 원래 제기되지 않은 질문에 대답하는 더 복잡한 코드를 추가 할 수 있습니다.
danorton

0

여기에 내가 쓴 작은 스크립트가 test.py있습니다. 오류 코드가 설정되어 있으면 오류 코드를 반환하고 find가 파일을 나열하지 않으면 오류 코드를 반환한다는 점에서 게시 된 다른 방법을 개선합니다.

from subprocess import Popen
import sys

p = Popen(['find'] + sys.argv)
out, err = p.communicate()
if p.returncode:
    sys.exit(p.returncode)
if not out:
    sys.exit(1)

명령 행 출력은 다음과 같습니다.

$ python test.py . -maxdepth 1 -name notthere
$ echo $?
1
$ find . -maxdepth 1 -name notthere
$ echo $?
0
$ find . -failedarg
find: unknown predicate `-failedarg'
$ echo $?
1

그런 다음 find에 오류가 있지만 파일이있는 결과는 다음과 같습니다.

$ ls -lh
$ d---------  2 jeff users   6 Feb  6 11:49 noentry
$ find .
.
./noentry
find: `./noentry': Permission denied
$ echo $?
1
$ find . | egrep '.*'
.
./noentry
find: `./noentry': Permission denied
$ echo $?
0
python ../test.py 
../test.py
$ echo $?
1

그런 다음 파일 목록을 원할 경우 -print 0전달 find된 변수를 사용하여 출력 변수를 널 (null)로 분할하거나 인쇄 문을 추가 할 수 있습니다.


-1

find성공하면 종료 상태 코드를 0으로 리턴하는 것만이 아닙니다 . 유닉스에서는 어떤 명령을 실행하더라도 성공하면 종료 상태를 0으로 반환합니다.

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