Zastanawiam się, aby wiedzieć, jaka jest różnica między używaniem +
i ;
na końcu -exec
polecenia, gdy korzystam z find
polecenia?
find .... -exec ... \;
VS
find .... -exec ... +
-exec ... \;
uruchomi jeden element po drugim. Więc jeśli masz trzy pliki, linia exec uruchomi się trzy razy.
-exec ... {} +
jest dla poleceń, które mogą przyjmować więcej niż jeden plik na raz (na przykład cat
, stat
, ls
). Pliki znalezione przez find
są powiązane ze sobą jak xargs
polecenie. Oznacza to mniej rozwidlania i małe operacje, może oznaczać znaczne przyspieszenie.
Oto demonstracja wydajności zawierająca 10 000 pustych plików.
$ mkdir testdir
$ touch testdir/{0000..9999}
$ time find testdir/ -type f -exec cat {} \;
real 0m8.622s
user 0m0.452s
sys 0m8.288s
$ time find testdir/ -type f -exec cat {} +
real 0m0.052s
user 0m0.015s
sys 0m0.037s
Ponownie działa to tylko w przypadku poleceń, które mogą przyjmować wiele nazw plików. Możesz sprawdzić, czy twoje polecenie jest takie, patrząc na jego stronę podręcznika. Oto streszczenie z man cat
:
SYNOPSIS
cat [OPTION]... [FILE]...
Elipsa [FILE]...
oznacza, że może zająć więcej niż jeden plik.
+
można używać tylko z pojedynczymi poleceniami i musisz mieć dokładnie jedno {}
w wierszu. \;
może działać z wieloma grupami od zera do wielu.
\;
, wykonane polecenie byłobycat 1; cat 2; cat 3
. Z+
wykonanym poleceniem byłobycat 1 2 3
.+
to nie jest POSIX, więc może nie być dostępny w systemach innych niż Linux. Nie martw się, jeśli nigdy nie opuścisz platformy, ale dobrze wiedzieć, czy kiedykolwiek będziesz musiał korzystać z Solaris. :)-exec <command> {} ';'
dlatego, że łatwiej jest mi pisać na klawiaturze (mogę pisać, ale nie mam najlepszej techniki).-exec ... {} +
to POSIX. Zobacz: pubs.opengroup.org/onlinepubs/9699919799/utilities/…-exec ... {} +
Rozszerzenie zaproponowano do włączenia do specyfikacji POSIX w 2001 r. I ratyfikowano w POSIX wydanie 6 w 2004 r. Możliwe, że wersja systemu Solaris, do którego przywykłeś, jest starsza niż ten standard POSIX (lub po prostu dotyczy wcześniejszej wersji).