Wie ist die Kommandozeile aufgebaut für find -exec command {} +

Wie ist die Kommandozeile aufgebaut für find -exec command {} +

Ich finde die Erklärung im Handbuch findetwas 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 -execAktion 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 die xargsBefehlszeilen. 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 echoes wird nur einmal ausgeführt.

Beachten Sie, dass Shells eine Begrenzung der Anzahl von Zeichen haben, die sie in einer einzelnen Befehlszeile akzeptieren. findweiß dies und wird, wenn zu viele Dateien vorhanden sind, um sie in eine Befehlszeile einzugeben, mehrere Male mit verschiedenen Dateien findausgefü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.

verwandte Informationen