- nackte Lösungen -
Wenn Sie findden Inhalt des gefundenen Verzeichnisses überspringen, aber weiterhin in anderen Verzeichnissen suchen -prunemöchten , verwenden Sie @laebshade als Vorschlag. Der vollständige Befehl sollte dann so aussehen
find . -type d -name somename -prune -exec ...
Wenn Sie jedoch die Suche und das Finden des ersten passenden Verzeichnisses findvollständig beenden möchten , suchen Sie nach -quit(seit Version 4.2.3von GNU find). Diese ist etwas kniffliger zu bedienen, da sie findsofort beendet wird - sie -quitmuss also ganz am Ende des Befehls stehen:
find . -type d -name somename -exec ... -quit
Damit dies wie erwartet funktioniert, muss sichergestellt werden, dass die -execRückgabe wahr ist (mit anderen Worten, ein Nullstatus ). Wenn Sie möchten, dass der Exit-Status von -execignoriert wird, damit das -quitimmer funktioniert, brauchen Sie einen kleinen Trick:
find . -type d -name somename \( -exec ... -o -true \) -quit
oder
find . -type d -name somename \( -exec ... -o -quit \)
oder
find . -type d -name somename \( -exec ... , -quit \) # a comma before -quit
- eine Erklärung -
Das Wichtigste an der Funktionsweise findist, dass alle Aktionen ("Tests") als logische Prädikate behandelt werden, die von links nach rechts interpretiert werden. Daher wird die letzte Aktion (zum Beispiel -quit) nur ausgeführt, wenn der gesamte vorherige Teil nicht false zurückgegeben hat . Standardmäßig werden alle Tests mit einem logischen "UND" verknüpft. Die -oOption ändert die Verknüpfung in "ODER".
Ein kniffliges Element von -oist, dass findIhr Befehl "optimiert" werden kann und das -execTeil nicht ausgeführt wird, wenn Sie nur tippen
find . -type d -name somename -exec ... -o -quit
Um dies zu bewältigen, können Sie die findAuswertung aller mit "OR" verknüpften Prädikate erzwingen, indem Sie sie in Klammern setzen.