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)
3 answers
Różnica prędkości będzie znikoma.
Ale musisz się upewnić, że:
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.
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.
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.)
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
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