Warum gibt es einen Unterschied in der Ausgabe zwischen der Verwendung
find . -exec ls '{}' \+
und
find . -exec ls '{}' \;
Ich habe:
$ find . -exec ls \{\} \+
./file1 ./file2
.:
file1 file2 testdir1
./testdir1:
testdir2
./testdir1/testdir2:
$ find . -exec ls \{\} \;
file1 file2 testdir1
testdir2
./file2
./file1
+
Verknüpfung mit-exec
immer maskiert ist, die+
Verknüpfung mit-mtime
jedoch nicht. Kennst du den Grund? Ich denke, es ist Gewohnheit,;
mit zu entkommen-exec
.;
. Ich kann mir nicht vorstellen, dass es jemals notwendig ist zu fliehen+
Alle bisherigen Antworten sind richtig. Ich biete dies als eine klarere (für mich) Demonstration des Verhaltens an, das beschrieben wird,
echo
anstattls
:Mit einem Semikolon wird der Befehl
echo
einmal pro gefundener Datei (oder eines anderen gefundenen Dateisystemobjekts) aufgerufen:Mit einem Plus wird der Befehl
echo
nur einmal aufgerufen. Jede gefundene Datei wird als Argument übergeben.Wenn
find
eine große Anzahl von Ergebnissen angezeigt wird, kann es sein, dass der Befehl, der aufgerufen wird, die Anzahl der Argumente drosselt.quelle
xargs
tun ist ... im Prinzip erstickt es nie an zu vielen Argumenten.find
(undxargs
) unter Solaris mehr Argumente ausgegeben werden, als verbraucht werden könnten. Diexargs
(undfind
) in GNUs Findutils scheinen sich vernünftiger zu verhalten, aber nicht jeder verwendet GNU.find
würden versuchen, die Grenze der Anzahl der Argumente nicht zu erreichen. Und dazu gehört auch Solaris (mindestens 10). Es kann fehlschlagen, wenn Sie so etwas wiefind ... -exec ksh -c 'cmd "$@" "$@"' sh {} +
oder tunfind ... -exec ksh -c 'files="$*" cmd "$@"' sh {} +
, aberfind
nicht wirklich dafür verantwortlich gemacht werden können. Beachten Sie, dass GNUfind
eine der letztenfind
zu unterstützenden Implementierungen war+
(früher war es schwierig, Skripte auf GNU-Systeme zu portieren).Von
man find
:-exec Befehl;
-exec Befehl {} +
So wie ich es verstehe,
\;
wird für jede gefundene Datei ein separater Befehl ausgeführtfind
, während\+
die Dateien angehängt und für alle ein einziger Befehl ausgeführt wird. Das\
ist ein Fluchtcharakter, also ist es:vs.
Das oben Genannte in meiner Shell zu tun, spiegelte die Ausgabe in Ihrer Frage wider.
Beispiel, wann Sie verwenden möchten
\+
Angenommen, zwei Dateien
1.tmp
und2.tmp
:1.tmp:
2.tmp:
Mit
\;
:Wenn Sie Folgendes verwenden
\+
(um die Ergebnisse von zu verkettenfind
):In diesem Fall ist es also der Unterschied zwischen
diff 1.tmp; diff 2.tmp
unddiff 1.tmp 2.tmp
Es gibt Fälle, in denen dies
\;
angemessen und\+
notwendig ist. Die Verwendung\+
mitrm
ist eine solche Instanz, bei der beim Entfernen einer großen Anzahl von Dateien die Leistung (Geschwindigkeit) überlegen ist\;
.quelle
find
hat spezielle Syntax. Sie verwenden das so{}
wie sie sind, weil sie eine Bedeutung haben, die als Pfadname der gefundenen Datei zu finden ist, und (die meisten) Shells sie nicht anders interpretieren. Sie benötigen den Backslash,\;
da das Semikolon eine Bedeutung für die Shell hat, die es auffrisst, bevorfind
es abgerufen werden kann. Was alsofind
NACH dem Fertigstellen der Shell in der an das C-Programm übergebenen Argumentliste angezeigt werden soll, istSie müssen jedoch
\;
in der Befehlszeile ein Semikolon durch die Shell zu den Argumenten führen.Sie können damit durchkommen,
\{\}
weil die Shell-zitierte Interpretation von\{\}
gerecht ist{}
. Ebenso könnten Sie '{}' verwenden.Was Sie nicht tun können, ist zu verwenden
weil die Shell das als ein Argument interpretiert ,
und
rm {} ;
ist nicht der Name eines Befehls. (Zumindest, wenn nicht wirklich jemand herumschraubt.)Aktualisieren
Der Unterschied ist zwischen
und
Das
+
verkettet die Namen in einer Befehlszeile.quelle
Der Unterschied zwischen
;
(Semikolon) oder+
(Pluszeichen) besteht darin, wie die Argumente an find's-exec
/-execdir
parameter übergeben werden. Beispielsweise:using
;
führt mehrere Befehle aus (separat für jedes Argument).Beispiel:
using
+
führt die geringstmöglichen Befehle aus (da die Argumente miteinander kombiniert werden). Es ist der Funktionsweise von Befehlen sehr ähnlichxargs
, daher werden so viele Argumente wie möglich pro Befehl verwendet, um zu vermeiden, dass die maximale Anzahl von Argumenten pro Zeile überschritten wird.Beispiel:
Siehe auch:
man find
quelle
Wir haben versucht, eine Datei für die Haushaltsführung zu finden.
finden . -exec echo {} \; Befehl lief über Nacht am Ende kein Ergebnis.
finden . -exec echo {} \ + hat Ergebnisse und dauerte nur wenige Stunden.
Hoffe das hilft.
quelle