Od man find
:
-exec polecenie;
Wykonaj polecenie; prawda, jeśli zwracany jest status 0. Wszystkie następujące argumenty do znalezienia są traktowane jako argumenty polecenia, aż do argumentu składającego się z „;” napotkano. Ciąg „{}” jest zastępowany przez aktualnie przetwarzaną nazwę pliku wszędzie tam, gdzie występuje w argumentach polecenia, a nie tylko w argumentach, w których występuje samodzielnie, jak w niektórych wersjach find. Obie te konstrukcje mogą wymagać zmiany znaczenia (z '\') lub zacytowania, aby chronić je przed ekspansją przez powłokę. Zobacz sekcję PRZYKŁADY sec, aby zobaczyć przykłady użycia opcji '-exec'. Określone polecenie jest uruchamiane raz dla każdego dopasowanego pliku.
Polecenie jest wykonywane w katalogu startowym. Istnieją nieuniknione problemy związane z bezpieczeństwem związane z używaniem opcji -exec;
-exec polecenie {} +
Ten wariant opcji -exec uruchamia określone polecenie na wybranych plikach, ale wiersz poleceń jest tworzony przez dołączenie nazwy każdego wybranego pliku na końcu ; całkowita liczba wywołań polecenia będzie znacznie mniejsza niż liczba dopasowanych plików. Linia poleceń jest zbudowana w podobny sposób, w jaki xargs buduje swoje linie poleceń. W poleceniu dozwolone jest tylko jedno wystąpienie „{}”. Polecenie jest wykonywane w katalogu startowym.
Tak więc, tak jak rozumiem, \;
wykonuje osobne polecenie dla każdego znalezionego pliku find
, podczas gdy \+
dołącza pliki i wykonuje pojedyncze polecenie na wszystkich z nich. \
Jest znakiem ucieczki, więc jest to:
ls testdir1; ls testdir2
vs
ls testdir1 testdir2
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
i 2.tmp
:
1. tmp:
1
2
3
2. tmp:
0
2
3
Z \;
:
find *.tmp -exec diff {} \;
> diff: missing operand after `1.tmp'
> diff: Try `diff --help' for more information.
> diff: missing operand after `2.tmp'
> diff: Try `diff --help' for more information.
Natomiast jeśli używasz \+
(do łączenia wyników find
):
find *.tmp -exec diff {} \+
1c1,3
< 1
---
> 0
> 2
> 30
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 with rm
jest jednym z takich przypadków, w którym w przypadku usuwania dużej liczby plików wydajność (szybkość) będzie wyższa \;
.