Ich möchte alle Verzeichnisse mit einer bestimmten Zeichenfolge finden, damit ich die darin enthaltenen Dateien erneut suchen kann.
Ich möchte also keine Zeit mit ./my-search-term/dir/my-search-term
usw. verschwenden .
Wie kann ich die Rekursion beenden, wenn ich das erste Verzeichnis für meine Suchbegriffe gefunden habe?
Antworten:
Die
-prune
Aktion machtfind
keine Rückholung in das Verzeichnis. Sie können es mit einer anderen Aktion kombinieren wie-exec
( in der Größenordnung von-prune
und-exec
spielt keine Rolle, solange-prune
wird so oder so ausgeführt).Beachten Sie, dass das Verschachteln
find
in afind -exec
etwas problematisch sein kann: Sie können es nicht-exec
im Inneren verwendenfind
, da der Terminator vom Äußeren als Terminator angesehen wirdfind
. Sie können das umgehen, indem Sie eine Shell aufrufen, aber keine Anführungszeichen setzen.quelle
-prune
gibt true zurück und kann vor das gesetzt werden-exec
.-o
Ich schätze, die Angewohnheit, dort drin zu sein. Und ich denke,-prune
vorher zu setzen-exec
ist besser lesbar.-prune
Option vorher nicht genutzt.mkdir -p x1 x2; touch x1/x11 x1/x12 x2/x21 x2/x22; find . -name 'x1*' -exec rm -rf {} \;
gibt den Fehler:find: ./x1: No such file or directory
. Die Lösung ist hinzuzufügen-prune
am Ende desfind
Befehls .find
expandieren{}
auch dann, wenn es als Teilzeichenfolge eines Arguments zu sehen ist-exec
. Eine solche Version vonfind
drosselt Ihren zweiten Befehl, weil der{}
im innerenfind
Befehl (im Shell-Befehl) durch den Namen des im äußeren gefundenen Verzeichnisses ersetzt wirdfind
. Sie können das beheben, indem Sie sagenfind . -name my-search-term -prune -exec sh -c 'find "$0" … -exec … "{"} +' {} \;
also mit"{"}
, welche die Schale in drehen wird{}
. … (Fortsetzung)- 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 aussehenWenn Sie jedoch die Suche und das Finden des ersten passenden Verzeichnisses
find
vollständig beenden möchten , suchen Sie nach-quit
(seit Version4.2.3
vonGNU find
). Diese ist etwas kniffliger zu bedienen, da siefind
sofort beendet wird - sie-quit
muss also ganz am Ende des Befehls stehen: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:oder
oder
- 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, dassfind
Ihr Befehl "optimiert" werden kann und das-exec
Teil nicht ausgeführt wird, wenn Sie nur tippenUm dies zu bewältigen, können Sie die
find
Auswertung aller mit "OR" verknüpften Prädikate erzwingen, indem Sie sie in Klammern setzen.quelle