Ich finde die Erklärung im Handbuch find
etwas unklar.
Was bedeutet „aber die Befehlszeile wird erstellt, indem am Ende jede ausgewählte Datei angehängt wird; die Gesamtzahl der Aufrufe des Befehls ist viel geringer als die Anzahl der übereinstimmenden Dateien“. Warum ist das so?
Nachfolgend der Text vonman find
-exec Befehl {} +
Diese Variante der
-exec
Aktion führt den angegebenen Befehl für die ausgewählten Dateien aus, die Befehlszeile wird jedoch erstellt, indem am Ende jeder ausgewählte Dateiname angehängt wird. Die Gesamtzahl der Aufrufe des Befehls ist viel geringer als die Anzahl der übereinstimmenden Dateien. Die Befehlszeile wird auf die gleiche Weise erstellt wie diexargs
Befehlszeilen. Innerhalb des Befehls ist nur eine Instanz von „{}“ zulässig. Der Befehl wird im Startverzeichnis ausgeführt.
Antwort1
Was bedeutet „aber die Befehlszeile wird erstellt, indem am Ende jede ausgewählte Datei angehängt wird; die Gesamtzahl der Aufrufe des Befehls ist viel geringer als die Anzahl der übereinstimmenden Dateien“. Warum ist das so?
Lassen Sie uns einige Beispieldateien erstellen:
touch {1..5}.txt
Lassen Sie uns zunächst einen Suchbefehl ausführen:
$ find . -exec echo my files are: {} +
my files are: . ./1.txt ./5.txt ./4.txt ./3.txt ./2.txt
Wie Sie sehen, {}
wird durch die Liste aller gefundenen Dateien ersetzt find
. In diesem Beispiel haben wir sechs übereinstimmende Dateien, aber echo
es wird nur einmal ausgeführt.
Beachten Sie, dass Shells eine Begrenzung der Anzahl von Zeichen haben, die sie in einer einzelnen Befehlszeile akzeptieren. find
weiß dies und wird, wenn zu viele Dateien vorhanden sind, um sie in eine Befehlszeile einzugeben, mehrere Male mit verschiedenen Dateien find
ausgeführt echo
, bis alle Dateinamen verarbeitet wurden. Aus diesem Grund ist „die Anzahl der Aufrufe des Befehls viel geringer als die Anzahl der übereinstimmenden Dateien.“
Lassen Sie uns dies testen, indem wir viele Dateien in unserem Verzeichnis erstellen:
touch this_is_a_long_file_name{1..10000}.txt
Lassen Sie uns nun einen Suchbefehl ausführen:
$ find . -exec bash -c 'echo $# files on this command line' _ {} +
3756 files on this command line
3754 files on this command line
2491 files on this command line
Wie Sie sehen, wurde der Exec-Befehl nur dreimal ausgeführt, obwohl dieses Verzeichnis über 10.000 Dateien enthielt.