-exec başarısız olursa aradan çık


14

İşlemlerden findbiri -execbir dosyada başarısız olursa kırılması için bir yazma yolu var mı ?

Örn ( javacbazı dosyalarda 1 çıkış kodunu döndürebilen ve başka bir nedenden dolayı uygun olmayan bir program olarak kullanılır):

$ 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

Yukarıdaki örnekte exec, dosyada A.javabaşarısız olmasına rağmen (ve 1 çıkış kodunu döndürdü), findkomut da devam etti ve dosyayı derledi B.java. Ayrılmanın bir yolu var mı yoksa bunun yerine bir findbiçim formi kullanmalıyım?

Bulmamın sürümü:

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

Yanıtlar:


5

Bence...

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

... hemen hemen her şeyi yapmalı find.


Teşekkürler @Gilles. Ne yapar $0?
mikeserv

1
$0İlk bağımsız değişken sh -c( $1geleneksel olarak programın adı yürütülmektedir, ancak burada bir pasajı yürütülmesi ve şekilde işlenen ediliyor dosya adını geçiyoruz - ikincisi, vs) $0kolayca bakınız örneğin markaların bazı duygusu ( içinde ps). Her $0zaman çalıştırılabilir olması gerektiğini ve böyle yazmanız gerektiğini söyleyen bir düşünce okulu vardır sh -c 'cmd "$1" …' sh {}.
Gilles 'SO- kötü olmayı bırak'

@Gilles - oldukça kaygan. Çok teşekkürler. Okul öncesi yolda arabada anladım, ama birkaç dakika düşünmek zorunda kaldım. Bu akıllı - kullanacağım. Benim için gerçekten tıklayan şey, Stephane'nin kendi mesajlarınızdan birinde okuduğunu hatırladığım bir düzenlemeydi find-sh $0ve bir findifadenin sonuna bir ekledi . Bu benim görüşüme göre daha yararlı görünüyor, ancak sanırım uzun vadede en önemli olan şey peşindesiniz.
mikeserv

Yukarıdaki durum için çalışmıyor. Sonra find . -iname \*.java -exec sh -c 'javac "${0}" || kill '$$ {} \;dosya A.javabaşarısız olur ve yine dosya B.java derlenmiş.
Marcus Junius Brutus

@MarcusJuniusBrutus - Çözdüm. Yorumunu daha önce görmüş olmalıydım. Tekrar üzgünüm.
mikeserv

4

En azından GNU ile findşunları kullanabilirsiniz:

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

Ben exec durur ve -o başlar nerede netleştirmekte sorun gibi görünüyor. Hem find . -iname \*.java -exec javac {} -o -quit \;ve find . -iname \*.java -exec javac {} \; -o -quit \;(farklı şekillerde) fail
Marcus Junius Brutus

@MarcusJuniusBrutus \;ve -exec(yani daha önce -o -quitbu durumda) için gereklidir, ancak başka hiçbir yerde olmayabilir.
Hauke ​​Laging

2
Kullanmak -exec ... -o -quitbenim için işe yaramıyor. Herhangi bir dosyayı işlemez . Ancak bu hat çalışır: find . -iname \*.java -not -exec javac '{}' \; -quit: -quiteğer denir -execyani yanlıştır. sıfırdan farklı bir değerle döner.
savanto

find . -iname \*.java -exec javac {} \; -o -quitde, herhangi bir dosya işlenemiyor. Garip find . -iname \* -exec echo 'foo' \; -o -quit yapar "süreç" dosyaları.
Marcus Junius Brutus

0

findKılavuzunuza başvurun . @ Hauke'nin cevabı beni aramaya motive etti ve QNX'in bulmasının -abortGNU -quitseçeneğine benzeyen bir seçeneği var . Benim ifadelerimi kullanmam \(ve \)gruplandırmam şartıyla çalışır :

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

Not: parens olmadan, ilk dosyada iptal edilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.