-exec가 실패하면 찾기에서 벗어남


14

작업 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

답변:


5

내 생각 엔 ...

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

... 거의 모든 트릭을 수행해야합니다 find.


감사합니다 @Gilles. 무엇을 $0합니까?
mikeserv 2016

1
$0에 대한 첫 번째 인수입니다. sh -c( $1두 번째 등입니다.) — 일반적으로 실행중인 프로그램의 이름입니다. 그러나 여기서는 스 니펫을 실행하고 처리중인 파일 이름을 의미가있는 것으로 전달합니다 $0(예 : 쉽게 볼 수 있음) 그것에서 ps). $0항상 실행 가능해야하며 작성해야한다는 생각의 학교가 있습니다 sh -c 'cmd "$1" …' sh {}.
Gilles 'SO- 악마 그만'

@Gilles-꽤 매끈합니다. 고마워 나는 유치원으로가는 길에 차에서 알아 냈지만 몇 분 동안 그것에 대해 생각해야했습니다. 똑똑하네요-사용하겠습니다. 무엇 실제로 나를 위해 그것을 통해 클릭하는 것은 나는 그가 추가하는 자신의 게시물 중 하나에 스테판의의 읽기 기억 편집이었다 find-sh $0a의 끝에 find문. 이것은 내 의견으로는 더 유용하지만 장기적으로 당신이 가장 중요하게 생각하는 것 같습니다.
mikeserv 2016

위의 경우에는 작동하지 않습니다. 후 find . -iname \*.java -exec sh -c 'javac "${0}" || kill '$$ {} \;파일이 A.java실패하고, 여전히 파일 B.java 컴파일됩니다.
Marcus Junius Brutus

@MarcusJuniusBrutus-고쳤습니다. 귀하의 의견을 더 일찍 보았을 것입니다. 다시 한 번 죄송합니다.
mikeserv 2016 년

4

적어도 GNU에서는 find다음을 사용할 수 있습니다.

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

exec가 중지되고 -o가 시작되는 위치를 명확히하는 데 문제가있는 것 같습니다. 둘 다 find . -iname \*.java -exec javac {} -o -quit \;find . -iname \*.java -exec javac {} \; -o -quit \;(다른 방법으로) 실패
마르쿠스 유니 우스 브루투스

@MarcusJuniusBrutus \;는 and of에 필요 하지만 (이 경우 -exec이전 -o -quit에) 다른 곳에는 없을 수 있습니다.
Hauke ​​Laging 2016 년

2
사용 -exec ... -o -quit이 작동하지 않습니다. 그것은 처리하지 않습니다 모든 파일을. 그러나이 줄은 작동합니다 : find . -iname \*.java -not -exec javac '{}' \; -quit: 거짓 -quit이면 호출됩니다 -exec. 0이 아닌 값으로 반환합니다.
savanto

find . -iname \*.java -exec javac {} \; -o -quit또한 파일을 처리하지 못합니다. 이상하게도 find . -iname \* -exec echo 'foo' \; -o -quit 않는다 "프로세스"파일을.
Marcus Junius Brutus 2016 년

0

find설명서를 참조하십시오 . @Hauke의 대답은 나에게 동기를 부여했으며 QNX의 find에는 -abortGNU -quit옵션 과 비슷한 옵션이 있습니다. 표현식을 사용 \(하고 \)그룹화 하면 나에게 효과적입니다 .

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

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

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