To, co napisałeś, wysyła listę nazw (i ścieżek) rozdzielonych znakiem nowej linii rm, ale rm nie wie, co zrobić z tym wejściem. Oczekuje tylko parametrów wiersza poleceń.
xargs pobiera dane wejściowe, zwykle oddzielone znakami nowej linii, i umieszcza je w wierszu poleceń, więc dodanie xargs sprawia, że miałeś to, co miałeś do roboty:
find . -name .svn | xargs rm -fr
xargsjest na tyle inteligentny, że przekaże tylko tyle argumentów, rmile może zaakceptować. Tak więc, jeśli masz milion plików, może on działać rm1 000 000/65 000 razy (jeśli twoja powłoka może zaakceptować 65002 argumentów w wierszu poleceń {65k plików + 1 dla rm + 1 dla -fr}).
Jak słusznie zauważyli ludzie, działają również:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
Obie pierwsze dwie -execformy wymagają rmusunięcia każdego folderu, więc jeśli miałbyś 1 000 000 folderów, rmbyłby wywoływany 1 000 000 razy. To z pewnością mniej niż idealne. Nowsze implementacje rmpozwalają na zakończenie polecenia ze +wskazaniem, rmktóre akceptuje jak najwięcej argumentów:
find . -name .svn -exec rm -rf {} +
Ostatnia wersja find / xargs używa print0, co powoduje, że find generuje dane wyjściowe, które wykorzystują \0jako terminator zamiast nowego wiersza. Ponieważ systemy POSIX dopuszczają dowolny znak oprócz \0nazwy pliku, jest to naprawdę najbezpieczniejszy sposób, aby upewnić się, że argumenty są poprawnie przekazywane do rmaplikacji lub wykonywanej aplikacji.
Ponadto istnieje plik, -execdirktóry zostanie wykonany rmz katalogu, w którym plik został znaleziony, a nie z katalogu podstawowego, i -depthktóry rozpocznie głębokość jako pierwszy.