Czy istnieje sposób na napisanie find
tak, aby się zepsuł, jeśli jedna z -exec
operacji zakończy się niepowodzeniem na pliku?
Np. ( javac
Jest dogodnie używany jako program, który może zwrócić kod wyjścia 1 dla niektórych plików i bez innego powodu):
$ 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
W powyższym przykładzie, mimo że exec
plik A.java
nie powiódł się (i zwrócił kod wyjścia 1), find
polecenie kontynuowało i skompilowało plik B.java
. Czy istnieje sposób na ucieczkę, find
czy for
zamiast tego powinienem użyć jakiejś formy ?
Moja wersja find:
$ find -version | head -1
find (GNU findutils) 4.4.2
$0
zrobić?$0
jest pierwszym argumentem dosh -c
($1
jest drugi itd.) - konwencjonalnie nazwa wykonywanego programu, ale tutaj wykonujesz fragment kodu i przekazujesz przetwarzaną nazwę pliku, co$0
ma sens (np. łatwo widzisz to wps
). Istnieje szkoła myślenia (do której oczywiście nie należę), która stwierdza, że$0
zawsze powinna być wykonywalna, a ty powinieneś pisaćsh -c 'cmd "$1" …' sh {}
.find-sh
$0
na końcufind
wypowiedzi. Moim zdaniem wydaje się to bardziej przydatne, choć chyba najważniejsze jest to, czego szukasz na dłuższą metę.find . -iname \*.java -exec sh -c 'javac "${0}" || kill '$$ {} \;
plikuA.java
i nadal kompiluje się plik B.java.Przynajmniej z GNU
find
możesz użyć:źródło
find . -iname \*.java -exec javac {} -o -quit \;
ifind . -iname \*.java -exec javac {} \; -o -quit \;
nie (na różne sposoby)\;
jest potrzebny na końcu-exec
(tzn. Wcześniej-o -quit
w tym przypadku), ale może nie być nigdzie indziej.-exec ... -o -quit
nie działa dla mnie. Nie przetwarza żadnych plików. Jednak działa ta linia:find . -iname \*.java -not -exec javac '{}' \; -quit
:-quit
nazywa jeśli-exec
jest fałszywe, tj. zwraca z niezerową.find . -iname \*.java -exec javac {} \; -o -quit
również nie przetwarza żadnych plików. O dziwo,find . -iname \* -exec echo 'foo' \; -o -quit
robi „proces” pliki.Zapoznaj się z
find
instrukcją. Odpowiedź Hauke zmotywowała mnie do spojrzenia, a wyszukiwanie QNX ma-abort
opcję, która wydaje się podobna do-quit
opcji GNU . Działa dla mnie, pod warunkiem że używam\(
i\)
grupuję wyrażenia:Uwaga: bez parens przerywa pierwszy plik.
źródło