답변:
인쇄되지 않지만 결과가 발견되면 0을 종료하는 가장 간단한 솔루션
find /tmp -name something | grep -q "."
종료 0은 찾기가 쉽고, 종료> 0은 일반적으로 오류가 발생하기 때문에 더 어렵습니다. 그러나 우리는 그렇게 할 수 있습니다.
if find -type f -exec false {} +
then
echo 'nothing found'
else
echo 'something found'
fi
find
의존하지 않는 것 같습니다 -exec
.
exec
반환 값이 아닌 섹션에 숨겨져 있음 ). 발견되지 않은 것을 구별 할 수 없으며 오류가 발생한 것을 발견합니다 (예 : 존재하지 않는 시작점에서 호출 된 경우).
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
exec
/ execdir
옵션 아래에 설명되어 있습니다 (와 함께 사용 +
) :If any invocation returns a non-zero value as exit status, then find returns a non-zero exit status.
이것이 가장 간결하고 직접적인 방법이라고 생각합니다.
test `find /tmp/ -name something -print -quit 2>/dev/null`
-print -quit
하여 귀하의 우려를 해결할 수 있습니다.
여기에 내가 쓴 작은 스크립트가 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)로 분할하거나 인쇄 문을 추가 할 수 있습니다.
find
성공하면 종료 상태 코드를 0으로 리턴하는 것만이 아닙니다 . 유닉스에서는 어떤 명령을 실행하더라도 성공하면 종료 상태를 0으로 반환합니다.
*
온egrep
정규식은 완전히 중복이다.egrep
정규식 구문을 사용하지 않기 때문에 평범한 오래된grep
것이 몇 마이크로 초 더 빠를 수 있습니다.