find-exec cmd {} + vs / xargs

Który z nich jest bardziej wydajny nad bardzo dużym zestawem plików i powinien być używany?

find . -exec cmd {} +

Lub

find . | xargs cmd

(Załóżmy, że w nazwach plików nie ma śmiesznych postaci)

Author: codeforester, 2009-05-22

3 answers

Różnica prędkości będzie znikoma.

Ale musisz się upewnić, że:

  1. Twój skrypt nie zakłada, że nie plik będzie miał spację, tabulator itp. w nazwa pliku; pierwsza wersja to Bezpieczny, drugi nie jest.

  2. Twój skrypt nie będzie traktował pliku zaczynającego się od "-" jako opcji.

Więc Twój kod powinien wyglądać tak:

find . -exec cmd -option1 -option2 -- {} +

Lub

find . -print0 | xargs -0 cmd -option1 -option2 --

Pierwsza wersja jest krótsza i łatwiejsza do napisania, ponieważ można zignorować 1, ale druga wersja jest bardziej przenośna i bezpieczna, ponieważ" -exec cmd {} + " jest stosunkowo nową opcją w GNU findutils (od 2005 r. wiele uruchomionych systemów nie będzie jej jeszcze mieć) i była buggy ostatnio . Również wiele osób nie zna tego "-exec cmd {} +", Jak widać z innych odpowiedzi.

 99
Author: Tometzky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-04 01:31:22
find . | xargs cmd

Jest bardziej wydajny(działa cmd jak najmniej razy, w przeciwieństwie do exec, która działa cmd raz na każdy mecz). Jednak napotkasz problemy, jeśli nazwy plików zawierają spacje lub znaki funky.

Zaleca się użycie:

find . -print0 | xargs -0 cmd

To zadziała, nawet jeśli nazwy plików zawierają znaki funkcyjne (-print0 sprawia, że find wyświetla dopasowania zakończone znakiem NUL, -0 sprawia, że xargs oczekuje tego formatu.)

 8
Author: ASk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-26 23:11:31

Nowoczesne wersje xargs często obsługują równoległe wykonywanie potoków.

Oczywiście może to być punkt zwrotny, jeśli chodzi o wybór pomiędzy find … -exec oraz … | xargs

 1
Author: poige,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-24 02:30:17