일치하는 파일이 없으면`find`가 0이 아닌 값을 반환하도록 할 수 있습니까? /tmp이라는 파일이없는 경우에도 something검색 find하면 0이

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

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

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



답변

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

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

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

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


답변

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

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

답변

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

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

답변

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

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

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

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

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


답변

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

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

종료 상태

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

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

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

답변

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

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

답변

여기에 내가 쓴 작은 스크립트가 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)로 분할하거나 인쇄 문을 추가 할 수 있습니다.