Ce que vous avez écrit envoie une liste de saut de ligne fichier séparé (les noms et les chemins d'accès) rm
, mais rm ne sais pas quoi faire avec cette entrée. C'est seulement attendre paramètres de ligne de commande.
xargs
prend en entrée, généralement séparés par des sauts de ligne, et de les placer sur la ligne de commande, donc, l'ajout de xargs fait ce que vous aviez travail:
find . -name .svn | xargs rm -fr
xargs
est assez intelligent qu'il ne fera que passer autant d'arguments pour rm
qu'il peut l'accepter. Ainsi, si vous aviez un million de fichiers, il peut exécuter rm
de 1 000 000/de 65 000 fois (si votre shell pourrait accepter 65,002 arguments sur la ligne de commande {65k fichiers + 1 pour le rm + 1 pour -fr}).
En tant que personnes ont habilement souligné, le suivant aussi le travail:
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf
Les deux premiers -exec
formes à la fois appel rm
pour chaque dossier étant supprimée, de sorte que si vous aviez de 1 000 000 dossiers, rm
serait invoquée 1 000 000 de fois. Ce n'est certainement pas l'idéal. Nouveaux implémentations de rm
vous permettre de conclure la commande avec un +
indiquant qu' rm
acceptera d'autant d'arguments que possible:
find . -name .svn -exec rm -rf {} +
La dernière recherche/xargs version utilise print0, qui permet de trouver de générer une sortie qui utilise \0
comme un terminator, plutôt que d'un retour à la ligne. Depuis POSIX systèmes de permettre à n'importe quel caractère, mais \0
dans le nom de fichier, c'est vraiment la manière la plus sûre pour que les arguments sont transmis correctement à l' rm
ou l'application en cours d'exécution.
En outre, il y a un -execdir
qui exécutera rm
à partir du répertoire dans lequel le fichier a été trouvé, plutôt que dans le répertoire de base et un -depth
qui va commencer parcours en profondeur d'abord.