Comment faire pour supprimer tous.répertoires svn de mes répertoires d'applications

l'une des missions d'un outil d'exportation que j'ai dans mon application, est de nettoyer tous les répertoires .svn de mon arborescence de répertoires d'application. Je suis à la recherche d'une commande récursive dans L'interpréteur de commandes Linux qui parcourra l'arbre entier et supprimera les fichiers .svn .

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

find . -name .svn | rm -fr

It n'a pas fonctionné...

184
demandé sur Peter Mortensen 2009-08-18 19:20:56

11 réponses

essayez ceci:

find . -name .svn -exec rm -rf '{}' \;

avant de lancer une commande comme celle-ci, j'aime souvent lancer cette première:

find . -name .svn -exec ls '{}' \;
419
répondu Greg 2016-09-22 07:06:20

ce que vous avez écrit envoie une liste de noms de fichiers newline séparés (et chemins) à rm , mais rm ne sait pas quoi faire avec cette entrée. Il attend seulement les paramètres de la ligne de commande.

xargs prend entrée, généralement séparée par des lignes, et les place sur la ligne de commande, de sorte que l'ajout de xargs rend ce que vous aviez de travail:

find . -name .svn | xargs rm -fr

xargs est assez intelligent qu'il ne passera que tant d'arguments à rm comme il peut accepter. Ainsi, si vous aviez un million de fichiers, il pourrait exécuter rm 1.000.000/65.000 fois (si votre shell pouvait accepter 65.002 arguments sur la ligne de commande {65K files + 1 pour rm + 1 pour-fr}).

comme les personnes ont indiqué adepte, les suivants travaillent aussi:

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 formulaires -exec appellent tous les deux rm pour chaque dossier supprimé, donc si vous aviez 1 000 000 de dossiers, rm serait invoqué 1 000 000 fois. Ce n'est certainement pas l'idéal. De nouvelles implémentations de rm vous permettent de conclure la commande avec un + indiquant que rm acceptera autant d'arguments que possible:

find . -name .svn -exec rm -rf {} +

la dernière version de find/xargs utilise print0, ce qui fait de find generate une sortie qui utilise " 1519140920 " comme terminateur plutôt qu'une nouvelle ligne. Puisque les systèmes POSIX permettent n'importe quel caractère mais "1519140920" dans le nom de fichier, c'est vraiment le moyen le plus sûr pour s'assurer que les arguments sont correctement passés à rm ou l'application étant exécutée.

de plus, il y a un -execdir qui exécutera rm à partir du répertoire dans lequel le fichier a été trouvé, plutôt qu'à partir du répertoire de base et un -depth qui lancera depth first.

50
répondu Kaleb Pederson 2009-08-18 15:44:31

pas besoin de pipes, xargs, exec, ou quoi que ce soit:

find . -name .svn -delete

Edit: c'est Juste une blague, évidemment -delete appels unlinkat() sous le capot, de sorte qu'il se comporte comme unlink ou rmdir et refusera de fonctionner sur des répertoires contenant des fichiers.

32
répondu A B 2014-07-30 09:01:41

Si vous n'aimez pas voir beaucoup de

find: `./.svn': No such file or directory

, puis utilisez l'interrupteur -depth :

find . -depth -name .svn -exec rm -fr {} \;
11
répondu lazy1 2009-08-18 15:29:32

il y a déjà beaucoup de réponses fournies pour supprimer le .svn-répertoire. Mais je tiens à ajouter, que vous pouvez éviter ces répertoires dès le début, si vous faites une exportation au lieu d'un checkout:

svn export <url>
11
répondu Mnementh 2009-08-18 16:05:55

tu l'as presque eu. Si vous voulez passer la sortie d'une commande comme paramètre à une autre, vous devrez utiliser xargs. Ajouter -print0 permet de s'assurer que le script peut gérer les chemins avec des espaces:

find . -type d -name .svn -print0|xargs -0 rm -rf
9
répondu soulmerge 2009-08-18 15:22:33

sous Windows, vous pouvez utiliser le script de Registre suivant pour ajouter" supprimer des dossiers SVN " à votre menu contextuel de clic droit. L'exécuter sur n'importe quel répertoire contenant ces satanés fichiers.

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""
9
répondu Nathan Taylor 2013-12-03 19:51:57
find . -name .svn |xargs rm -rf
4
répondu Itay Moav -Malimovka 2009-08-18 15:36:02

comme un problème important, lorsque vous voulez utiliser shell à supprimer .svn folders vous avez besoin de l'argument -depth pour empêcher la commande find d'entrer dans le répertoire qui vient d'être supprimé et d'Afficher des messages d'erreur comme par exemple

"find: ./.svn: No such file or directory"

par conséquent, vous pouvez utiliser la commande find comme suit:

cd [dir_to_delete_svn_folders]
find . -depth -name .svn -exec rm -fr {} \;
4
répondu fatihk 2015-10-23 07:15:48

essayez ceci:

find . -name .svn -exec rm -v {} \;

pour en savoir plus sur la commande developerWorks .

3
répondu scompt.com 2009-08-18 15:22:41

alternativement, si vous voulez exporter une copie sans modifier la copie de travail, vous pouvez utiliser rsync:

rsync -a --exclude .svn path/to/working/copy path/to/export
2
répondu pimlottc 2009-08-18 15:38:01