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.
execzaskoczyło - użycie spowoduje wyświetlenie wyników w takiej postaci, w jakiej zostaną znalezione, xargsco, 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 xargsto nie działa, cierpliwość jest wskazana.
-print0find 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 cmdtak kilka razy, jak to możliwe, w przeciwieństwie do tego exec, że działa cmdraz 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 ( -print0marki findwydrukować znakiem NUL mecze, -0marki xargsoczekiwać tego formatu).
xargspodejście to jest w rzeczywistości znacznie wolniejsze, jeśli nie ma pasujących plików (lub tylko kilka) i cmdnie ma wiele do zrobienia dla każdego pliku. Na przykład, jeśli zostanie uruchomiona w pustym katalogu, xargswersja 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 ...)