190 votes

Comment faire pour supprimer tous les répertoires .svn de mes répertoires de l’application

Une des missions d’un outil d’exportation j’ai dans mon application, consiste à nettoyer toutes les répertoires de mon arbre de répertoire d’application. Je cherche une commande récursive dans le shell de Linux qui traverse l’ensemble de l’arborescence et supprimer le fichiers.

Je n’utilise pas exporter, car ce script sera utilisé pour d’autres noms de fichiers/répertoires qui ne sont pas associés à SVN. J’ai essayé quelque chose comme :

Il n’a pas fonctionné...

433voto

Greg Points 2980

Essayez ceci :

Avant d’exécuter une commande comme ça, j’aime souvent d’exécuter cette première :

51voto

Kaleb Pederson Points 22428

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.

31voto

alberge Points 2771

Pas besoin de tuyaux, xargs, exec ou quoi que ce soit :

Edit : Je plaisante, évidemment appels sous le capot, donc il se comporte comme ou et refuse de fonctionner sur les répertoires contenant les fichiers.

13voto

Mnementh Points 19831

Il y a déjà beaucoup de réponses fournies pour supprimer le répertoire .svn. Mais je tiens à ajouter, que vous pouvez éviter ces répertoires depuis le début, si vous effectuez une exportation au lieu d’une extraction :

9voto

soulmerge Points 37314

Vous l’aviez presque. Si vous souhaitez passer la sortie d’une commande en tant que paramètres à une autre, vous devrez utiliser xargs. Ajout de `` s’assure que le script peut gérer les chemins d’accès avec des espaces :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X