Dlaczego istnieje różnica w wynikach między użyciem
find . -exec ls '{}' \+
i
find . -exec ls '{}' \;
Mam:
$ find . -exec ls \{\} \+
./file1 ./file2
.:
file1 file2 testdir1
./testdir1:
testdir2
./testdir1/testdir2:
$ find . -exec ls \{\} \;
file1 file2 testdir1
testdir2
./file2
./file1
+
skojarzenie z-exec
jest zawsze uciekane, ale+
skojarzone z-mtime
nie jest. Czy znasz powód? Myślę, że to nawyk ucieczki;
związany z-exec
.;
. Nie wyobrażam sobie, żeby kiedykolwiek trzeba było uciec+
Wszystkie dotychczasowe odpowiedzi są poprawne. Proponuję to jako jaśniejszą (dla mnie) demonstrację zachowania, które jest opisane przy użyciu,
echo
a niels
:Ze średnikiem polecenie
echo
jest wywoływane raz na każdy znaleziony plik (lub inny obiekt systemu plików):Z plusem polecenie
echo
jest wywoływane tylko raz. Każdy znaleziony plik jest przekazywany jako argument.Jeśli pojawi
find
się duża liczba wyników, może się okazać, że polecenie, które nazywamy, dławi liczbę argumentów.źródło
xargs
tak ... w zasadzie nigdy nie dusi się zbyt wieloma argumentami.find
(ixargs
) w Solarisie emitowało więcej argumentów, niż można było zużyć.xargs
(Ifind
) w findutils` GNU wydaje się zachowywać bardziej sensownie, ale nie każdy używa GNU.find
się uniknąć przekroczenia limitu liczby argumentów. I to obejmuje Solaris (przynajmniej 10). Może się to nie powieść, jeśli zrobisz coś takiego , jakfind ... -exec ksh -c 'cmd "$@" "$@"' sh {} +
lubfind ... -exec ksh -c 'files="$*" cmd "$@"' sh {} +
, alefind
tak naprawdę nie można za to winić. Zwróć uwagę, że GNUfind
było jedną z ostatnichfind
implementacji do obsługi+
(kiedyś było to trudne do przeniesienia skryptu na systemy GNU).Od
man find
:-exec polecenie;
-exec polecenie {} +
Tak więc, tak jak rozumiem,
\;
wykonuje osobne polecenie dla każdego znalezionego plikufind
, podczas gdy\+
dołącza pliki i wykonuje pojedyncze polecenie na wszystkich z nich.\
Jest znakiem ucieczki, więc jest to:vs
Wykonanie powyższego w mojej powłoce odzwierciedlało wynik twojego pytania.
przykład, kiedy chciałbyś użyć
\+
Załóżmy, że dwa pliki
1.tmp
i2.tmp
:1. tmp:
2. tmp:
Z
\;
:Natomiast jeśli używasz
\+
(do łączenia wynikówfind
):W tym przypadku jest to różnica między
diff 1.tmp; diff 2.tmp
idiff 1.tmp 2.tmp
Są przypadki, w których
\;
jest to właściwe i\+
będzie konieczne. Korzystanie\+
z programu withrm
jest jednym z takich przypadków, w którym w przypadku usuwania dużej liczby plików wydajność (szybkość) będzie wyższa\;
.źródło
find
ma specjalną składnię. Używasz takich,{}
jakie są, ponieważ mają one znaczenie do znalezienia jako ścieżki do znalezionego pliku, a (większość) powłok nie interpretuje ich inaczej. Potrzebujesz odwrotnego ukośnika,\;
ponieważ średnik ma znaczenie dla powłoki, która zjada go, zanim będziefind
mógł go uzyskać. Więc to, cofind
chce zobaczyć PO zakończeniu powłoki, na liście argumentów przekazanej do programu w C, toale potrzebujesz
\;
w wierszu poleceń, aby uzyskać średnik przez powłokę do argumentów.Możesz uciec,
\{\}
ponieważ cytowana przez powłokę interpretacja\{\}
jest słuszna{}
. Podobnie możesz użyć „{}”.To, czego nie możesz zrobić, to użyć
ponieważ powłoka interpretuje to jako jeden argument,
i
rm {} ;
nie jest nazwą polecenia. (Przynajmniej chyba, że ktoś naprawdę się kręci.)Aktualizacja
różnica jest pomiędzy
i
+
Jest catenating nazwy na linii poleceń.źródło
Różnica między
;
(średnikiem) a+
(znakiem plusa) polega na tym, jak argumenty są przekazywane do parametru find-exec
/-execdir
. Na przykład:użycie
;
spowoduje wykonanie wielu poleceń (osobno dla każdego argumentu),Przykład:
użycie
+
spowoduje wykonanie najmniejszej możliwej liczby poleceń (ponieważ argumenty są łączone). Jest to bardzo podobne do działaniaxargs
polecenia, więc użyje jak największej liczby argumentów na polecenie, aby uniknąć przekroczenia maksymalnego limitu argumentów w wierszu.Przykład:
Zobacz też:
man find
źródło
próbowaliśmy znaleźć plik do sprzątania.
odnaleźć . -exec echo {} \; komenda przebiegła przez noc w końcu bez rezultatu.
odnaleźć . -exec echo {} \ + daje wyniki i zajęło tylko kilka godzin.
Mam nadzieję że to pomoże.
źródło