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:
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 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.
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ę, że xargs
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.
find . | xargs cmd
jest bardziej efektywny (działa cmd
tak kilka razy, jak to możliwe, w przeciwieństwie do tego exec
, że działa cmd
raz na każdy mecz). Jednak napotkasz kłopoty, jeśli nazwy plików zawierają spacje lub znaki funky.
Sugeruje się użycie:
find . -print0 | xargs -0 cmd
to będzie działać, nawet jeśli nazwy plików zawierają znaki funkowe ( -print0
marki find
wydrukować znakiem NUL mecze, -0
marki xargs
oczekiwać tego formatu).
xargs
podejście to jest w rzeczywistości znacznie wolniejsze, jeśli nie ma pasujących plików (lub tylko kilka) i cmd
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 ...)