Co oznacza {} + w poleceniu find's -exec?

23

Chcę poznać znaczenie {} +w execpoleceniu, a jaka jest różnica między {} +i {} \;. Dokładnie, jaka jest różnica między tymi dwoma:

find . -type f -exec chmod 775 {} +
find . -type f -exec chmod 775 {} \;
Mohsen
źródło
5
Jest to man find(1)szczegółowo opisane, łatwo dostępne dla każdego. Nie bądź leniwy.
Miroslav Koškár,
Dzięki, drogi Miroslav, szukałem man exec!
Ach, nigdy wcześniej nie spotkałem się z {} +użytkowaniem. Zwykle używam do tego xargs (i często find ... -print0 | xargs -0 ...)

Odpowiedzi:

27

Użycie ;(średnika) lub +(znaku plus) jest obowiązkowe w celu zakończenia poleceń powłoki wywoływanych przez -exec/ execdir.

Różnica między ;(średnikiem) lub +(znakiem plus) polega na tym, w jaki sposób argumenty są przekazywane do parametru -exec/ find -execdir. Na przykład:

  • użycie ;spowoduje wykonanie wielu poleceń (osobno dla każdego argumentu),

    Przykład:

    $ find /etc/rc* -exec echo Arg: {} ';'
    Arg: /etc/rc.common
    Arg: /etc/rc.common~previous
    Arg: /etc/rc.local
    Arg: /etc/rc.netboot
    

    Wszystkie poniższe argumenty findsą uważane za argumenty polecenia.

    Ciąg {}jest zastępowany przez przetwarzaną nazwę bieżącego pliku.

  • użycie +spowoduje wykonanie możliwie najmniejszej liczby poleceń (ponieważ argumenty są łączone razem). Jest bardzo podobny do działania xargspolecenia, więc użyje jak największej liczby argumentów na polecenie, aby uniknąć przekroczenia maksymalnego limitu argumentów na wiersz.

    Przykład:

    $ find /etc/rc* -exec echo Arg: {} '+'
    Arg: /etc/rc.common /etc/rc.common~previous /etc/rc.local /etc/rc.netboot
    

    Linia poleceń jest budowana przez dołączenie każdej wybranej nazwy pliku na końcu.

    {}W poleceniu dozwolona jest tylko jedna instancja

Zobacz też:

kenorb
źródło
Nie jest różnica i poważna. Zobacz user1116056 męska odpowiedź
Jahid
24

Biorąc pod uwagę, że polecenie find znajduje się poniżej trzech plików:

fileA
fileB
fileC

Jeśli używasz znaku -execplus ( +),

find . -type f -exec chmod 775 {} +  

To będzie:

chmod 775 fileA fileB fileC

Linia poleceń jest budowana przez dołączanie każdej pasującej nazwy pliku na końcu, co jest identyczne jak w przypadku xargsbudowania linii poleceń. Całkowita liczba wywołań polecenia ( chmodw tym przypadku) będzie znacznie mniejsza niż liczba dopasowanych plików.

Jeśli używasz -execśrednika ( ;),

find . -type f -exec chmod 775 {} \;

To będzie:

chmod 775 fileA
chmod 775 fileB
chmod 775 fileC
użytkownik 1116056
źródło
5

Zgodnie z man find:

-exec polecenie {} + Ten wariant akcji -exec uruchamia określone polecenie na wybranych plikach, ale linia poleceń jest budowana przez dołączenie każdej wybranej nazwy pliku na końcu; całkowita liczba wywołań polecenia będzie znacznie mniejsza niż liczba dopasowanych plików. Wiersz poleceń jest zbudowany w taki sam sposób, jak xargs buduje wiersze poleceń. W poleceniu dozwolona jest tylko jedna instancja „{}”. Polecenie jest wykonywane w katalogu startowym.

BE77Y
źródło