Jaka jest różnica między użyciem „+” (plus) i „;” (średnik) w poleceniu -exec?

28

Zastanawiam się, aby wiedzieć, jaka jest różnica między używaniem +i ;na końcu -execpolecenia, gdy korzystam z findpolecenia?

find .... -exec ... \; 

VS

find .... -exec ... + 
αғsнιη
źródło

Odpowiedzi:

36

-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 findsą powiązane ze sobą jak xargspolecenie. 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.

Oli
źródło
4
Przykład: z \;, wykonane polecenie byłoby cat 1; cat 2; cat 3. Z +wykonanym poleceniem byłoby cat 1 2 3.
Alaa Ali,
AFAIK, +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. :)
Simon Richter,
Och, dziękuję za informację. Zwykle -exec <command> {} ';'dlatego, że łatwiej jest mi pisać na klawiaturze (mogę pisać, ale nie mam najlepszej techniki).
hanetzer
2
@ SimonRichter: Nie, -exec ... {} +to POSIX. Zobacz: pubs.opengroup.org/onlinepubs/9699919799/utilities/…
cuonglm
@ SimonRichter -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).
Oli