- nackte Lösungen -
Wenn Sie find
den Inhalt des gefundenen Verzeichnisses überspringen, aber weiterhin in anderen Verzeichnissen suchen -prune
mö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 find
vollständig beenden möchten , suchen Sie nach -quit
(seit Version 4.2.3
von GNU find
). Diese ist etwas kniffliger zu bedienen, da sie find
sofort beendet wird - sie -quit
muss also ganz am Ende des Befehls stehen:
find . -type d -name somename -exec ... -quit
Damit dies wie erwartet funktioniert, muss sichergestellt werden, dass die -exec
Rückgabe wahr ist (mit anderen Worten, ein Nullstatus ). Wenn Sie möchten, dass der Exit-Status von -exec
ignoriert wird, damit das -quit
immer 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 find
ist, 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 -o
Option ändert die Verknüpfung in "ODER".
Ein kniffliges Element von -o
ist, dass find
Ihr Befehl "optimiert" werden kann und das -exec
Teil 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 find
Auswertung aller mit "OR" verknüpften Prädikate erzwingen, indem Sie sie in Klammern setzen.