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
xargs
ist intelligent genug, dass es nur so viele Argumente weitergibt, rm
wie es akzeptieren kann. Wenn Sie also eine Million Dateien hatten, wurde diese möglicherweise rm
1.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 -exec
Formularen wird rm
jeder Ordner gelöscht. Wenn Sie also 1.000.000 Ordner haben, wird rm
dieser 1.000.000 Mal aufgerufen. Das ist sicherlich weniger als ideal. Neuere Implementierungen von rm
ermöglichen es Ihnen, den Befehl mit einer +
Angabe abzuschließen, die rm
so 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 \0
als Terminator und nicht als Zeilenumbruch verwendet wird. Da POSIX-Systeme nur Zeichen \0
im Dateinamen zulassen , ist dies der sicherste Weg, um sicherzustellen, dass die Argumente korrekt an rm
die Anwendung übergeben werden oder die Anwendung ausgeführt wird.
Darüber hinaus gibt es eine -execdir
, die rm
aus dem Verzeichnis ausgeführt wird, in dem die Datei gefunden wurde, und nicht aus dem Basisverzeichnis, und eine -depth
, die zuerst die Tiefe startet.