Was Sie geschrieben haben, sendet eine Liste von durch Zeilenumbrüche getrennten Dateinamen (und Pfaden) an rm, aber rm weiß nicht, was mit dieser Eingabe zu tun ist. Es werden nur Befehlszeilenparameter erwartet.
xargs Nimmt Eingaben entgegen, die normalerweise durch Zeilenumbrüche getrennt sind, und platziert sie in der Befehlszeile. Wenn Sie also xargs hinzufügen, funktioniert das, was Sie hatten:
find . -name .svn | xargs rm -fr
xargsist intelligent genug, dass es nur so viele Argumente weitergibt, rmwie es akzeptieren kann. Wenn Sie also eine Million Dateien hatten, wurde diese möglicherweise rm1.000.000 / 65.000 Mal ausgeführt (wenn Ihre Shell 65.002 Argumente in der Befehlszeile akzeptieren konnte {65.000 Dateien + 1 für rm + 1 für -fr}).
Wie Personen zutreffend hervorgehoben haben, funktionieren auch die folgenden:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
In den ersten beiden -execFormularen wird rmjeder Ordner gelöscht. Wenn Sie also 1.000.000 Ordner haben, wird rmdieser 1.000.000 Mal aufgerufen. Das ist sicherlich weniger als ideal. Neuere Implementierungen von rmermöglichen es Ihnen, den Befehl mit einer +Angabe abzuschließen, die rmso viele Argumente wie möglich akzeptiert:
find . -name .svn -exec rm -rf {} +
Die letzte find / xargs-Version verwendet print0, wodurch find eine Ausgabe generiert, die \0als Terminator und nicht als Zeilenumbruch verwendet wird. Da POSIX-Systeme nur Zeichen \0im Dateinamen zulassen , ist dies der sicherste Weg, um sicherzustellen, dass die Argumente korrekt an rmdie Anwendung übergeben werden oder die Anwendung ausgeführt wird.
Darüber hinaus gibt es eine -execdir, die rmaus dem Verzeichnis ausgeführt wird, in dem die Datei gefunden wurde, und nicht aus dem Basisverzeichnis, und eine -depth, die zuerst die Tiefe startet.