특정 파일에 대한 작업이 실패하면 중단 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의 발견에는 -abort
GNU 옵션과 -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 {} 등)가 스크립팅 목적으로 거의 쓸모 없게 됩니다.