-exec가 실패하면 찾기 종료

-exec가 실패하면 찾기 종료

특정 파일에 대한 작업이 실패하면 중단 find되도록 파일을 작성하는 방법이 있습니까 ?-exec

예를 들어( javac특정 파일에서 다른 이유 없이 종료 코드 1을 반환할 수 있는 프로그램으로 편리함):

$ echo "public classXX A{}" >> A.java
$ echo "public class B{}" >> B.java
$ find . -iname \*.java -exec javac {} \;
./A.java:1: error: class, interface, or enum expected
public classXX A{}
       ^
1 error

위의 예에서는 exec파일이 A.java실패하고 종료 코드 1을 반환 하더라도 find명령이 계속되어 파일을 컴파일합니다 B.java. 돌파할 수 있는 방법이 있습니까 ? 아니면 대신 find어떤 양식을 사용해야 합니까 ?for

내가 찾은 버전:

$ find -version  | head -1
find (GNU findutils) 4.4.2

답변1

제 생각에는...

find ... -exec sh -c 'cmd "$0" || kill $PPID' \{\} \;

...어떤 문제든 해결해야 합니다 find.

답변2

적어도 GNU의 경우 다음을 find사용할 수 있습니다.

find ... -exec ... -o -quit

답변3

설명서 를 참조하세요 find. @Hauke의 답변은 제가 그것을 찾도록 영감을 주었습니다. QNX의 발견에는 -abortGNU 옵션과 -quit비슷한 옵션이 있습니다. 내가 사용 \(하고 \)표현을 그룹화하면 나에게 효과적입니다.

find . -mtime -4 -name <pattern> \( -exec my_cmd {} \; -o  -abort \) 

참고: 대괄호가 없으면 첫 번째 파일에서 중단됩니다.

답변4

find --version
find (GNU findutils) 4.6.0

find . -name '*'   \( -exec bash -c 'echo "$0" ; true' {} \; -o -quit \)

현재 디렉토리의 모든 것을 나열합니다

find . -name '*'   \( -exec bash -c 'echo "$0" ; false' {} \; -o -quit \)

발견된 첫 번째 항목(.)을 나열하고 중지합니다.

여기에 있는 경로에서 실행되는 명령은 다음과 같습니다.

echo "$0" ; true # echoes path and succeeds / returns true

그리고

echo "$0" ; false  # echoes path and fails / returns false

find로 평가된 표현식은 다음과 같습니다.

-exec bash -c 'echo "$0" ; true/false' {} \; 

그리고

-quit

-o는 논리적 OR(단락)입니다.

\( 및 \)가 필요하므로 쉘은 찾을 모든 것을 전달하기 전에 항목을 평가하려고 시도하지 않습니다.

find . -name '*'   '(' -exec bash -c 'echo "$0" ; true' {} \; -o -quit ')'

그리고

find . -name '*'   '(' -exec bash -c 'echo "$0" ; false' {} \; -o -quit ')'

위의 \( \) 버전과 동일한 결과를 제공합니다.

find는 " " 를 expr이 처음으로 실패할 때 전체 프로세스가 중지된다는 ( <expression> -o -quit )의미로 해석합니다 .(expr || stop)

알아채다 실패한 종료 코드를 find 호출자에게 다시 전달할 수 있는 방법이 없는 것 같습니다. 이로 인해 함수(-exec {} 등)가 스크립팅 목적으로 거의 쓸모 없게 됩니다.

관련 정보