Ich habe hier gelesen , dass Sie die Anzahl der Aufrufe von command
in zählen können, -exec command {} +
indem Sie | wc -l
bis zum Ende weiterleiten.
Ich verstehe zwar, dass dies -execdir
anders ist, aber für jedes übereinstimmende Unterverzeichnis, das find
entdeckt wird, wird ein Aufruf des command
Unterverzeichnisses ausgeführt, in dem es enthalten ist, wenn ich mehr als eine Datei habe, die in einem Unterverzeichnis übereinstimmt, sollte dies nicht der Fall sein Bekomme ich nicht die Anzahl der Aufrufe, die der Anzahl der übereinstimmenden Unterverzeichnisse entspricht, und nicht die Anzahl der Aufrufe, die der Anzahl der übereinstimmenden Dateien in diesen Unterverzeichnissen entsprechen?
Ich werde mit letzterem enden, wenn ich Folgendes ausführe:
$ find . -name "bob*" -execdir echo {} + | wc -l
Die Manpage für die execdir command {} +
Staaten, dass die erstere der Fall sein sollte:
Wie bei der
-exec
Aktion erstellt die+
Form von-execdir
eine Befehlszeile, um mehr als eine übereinstimmende Datei zu verarbeiten, aber bei jedem Aufruf voncommand
werden nur Dateien aufgelistet, die im selben Unterverzeichnis vorhanden sind.
dh
Ich erhalte:
./file1inDir1
./file2inDir1
./file3InDir2
./file4InDir3
Wenn ich das erwarte, basierend auf der Manpage:
./file1inDir1 ./file2inDir1
./file3InDir2
./file4InDir3
echo
und die Argumente von generiert werden{} +
und Sie keine Zeilenumbrüche in Ihren Dateinamen haben (die meisten Leute nicht), dann ist die Anzahl der Zeilen die Anzahl der Aufrufe und es funktioniert. Wenn Befehl gesagt wirdhead -n 999000 /dev/urandom
, geht es schrecklich schief.Antworten:
Dies ist ein Leistungsproblem von
find
. Infindutils
Version 4.3.4, eine Abhilfe hatte die Anzahl der Argumente zu beschränken,-execdir ... {} +
verwenden zu 1. In der Version 4.5.9 die Grenze entfernt wurde.Siehe ein Beispiel:
Mit
-execdir {} +
sollte der Befehl dreimal ausgeführt werden. Der zweite Aufruf sollte 3 Argumente haben.Mit
find
4.4.2:Mit
find
4.6.0:quelle