Który z nich jest bardziej wydajny w przypadku bardzo dużego zestawu plików i powinien być używany?
find . -exec cmd {} +
lub
find . | xargs cmd
(Załóżmy, że w nazwach plików nie ma zabawnych znaków)
linux
unix
command-line
find
dogbane
źródło
źródło
Odpowiedzi:
Różnica prędkości będzie nieznaczna.
Ale musisz się upewnić, że:
Twój skrypt nie przyjmie, że żaden plik nie będzie miał spacji, tabulacji itp. W nazwie pliku; pierwsza wersja jest bezpieczna, druga nie.
Twój skrypt nie potraktuje pliku zaczynającego się od „
-
” jako opcji.Twój kod powinien więc wyglądać następująco:
lub
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 roku wiele działających systemów jeszcze jej nie ma) i ostatnio było wadliwe . Również wiele osób nie wie o tym "-exec cmd {} +
", jak widać na podstawie innych odpowiedzi.źródło
exec
zaskoczyło - użycie spowoduje wyświetlenie wyników w takiej postaci, w jakiej zostaną znalezione,xargs
co, jak się wydaje, będzie czekało , aż cały katalog zostanie przeszukany przed zapisaniem na standardowe wyjście. Jeśli próbujesz tego na dużym katalogu i wydaje się, żexargs
to nie działa, cierpliwość jest wskazana.-print0
find zwraca nazwy plików oddzielone znakiem nowej linii, ale nowa linia może również być częścią nazwy pliku, co czyni ją niejednoznaczną. Bajt 0 nie może, więc jest to bezpieczny separator. Tak - dodanie--
do polecenia, które je obsługuje, jest dobrą praktyką, gdy nie możesz kontrolować jego argumentów, nawet jeśli nie zawsze jest to wymagane lub niebezpieczne.jest bardziej efektywny (działa
cmd
tak kilka razy, jak to możliwe, w przeciwieństwie do tegoexec
, że działacmd
raz na każdy mecz). Jednak napotkasz kłopoty, jeśli nazwy plików zawierają spacje lub znaki funky.Sugeruje się użycie:
to będzie działać, nawet jeśli nazwy plików zawierają znaki funkowe (
-print0
markifind
wydrukować znakiem NUL mecze,-0
markixargs
oczekiwać tego formatu).źródło
xargs
podejście to jest w rzeczywistości znacznie wolniejsze, jeśli nie ma pasujących plików (lub tylko kilka) icmd
nie ma wiele do zrobienia dla każdego pliku. Na przykład, jeśli zostanie uruchomiona w pustym katalogu,xargs
wersja zajmie co najmniej dwa razy więcej czasu, ponieważ zamiast jednego trzeba uruchomić dwa procesy. (Tak, różnica jest zwykle niezauważalna na * nix, ale w pętli może być ważna; lub spróbuj to kiedyś w systemie Windows ...)xargs
Wersje Modern często obsługują równoległe wykonywanie potoków.Oczywiście może to być punkt zwrotny, jeśli chodzi o wybór między
find … -exec
a… | xargs
źródło