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
xargs
jest na tyle inteligentny, że przekaże tylko tyle argumentów, rm
ile może zaakceptować. Tak więc, jeśli masz milion plików, może on działać rm
1 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 -exec
formy wymagają rm
usunięcia każdego folderu, więc jeśli miałbyś 1 000 000 folderów, rm
byłby wywoływany 1 000 000 razy. To z pewnością mniej niż idealne. Nowsze implementacje rm
pozwalają na zakończenie polecenia ze +
wskazaniem, rm
któ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ą \0
jako terminator zamiast nowego wiersza. Ponieważ systemy POSIX dopuszczają dowolny znak oprócz \0
nazwy pliku, jest to naprawdę najbezpieczniejszy sposób, aby upewnić się, że argumenty są poprawnie przekazywane do rm
aplikacji lub wykonywanej aplikacji.
Ponadto istnieje plik, -execdir
który zostanie wykonany rm
z katalogu, w którym plik został znaleziony, a nie z katalogu podstawowego, i -depth
który rozpocznie głębokość jako pierwszy.