Comment faire pour supprimer tous .svn répertoires à partir de mon application répertoires
L'une des missions d'un outil d'exportation que j'ai dans mon application, est de nettoyer tous les .svn
répertoires de mon répertoire de l'application de l'arbre. Je suis à la recherche d'un circuit de commande dans le shell de Linux, qui va traverser la totalité de l'arbre et de supprimer les .svn
fichiers.
Je ne suis pas à l'aide à l'exportation, que ce script sera utilisé pour d'autres les noms de fichiers qui ne sont pas liés à SVN. J'ai essayé quelque chose comme:
find . -name .svn | rm -fr
Il n'a pas de travail...
- Votre commande devrait fonctionner si vous utilisez la "xargs rm -rf"
- Vous pouvez également modifier la suppression de la commande "rm -rfi" juste pour s'assurer que vous êtes positif que vous voulez supprimer les répertoires.
- N'utilisez pas de xargs si.. vous allez avoir du mal des répertoires séparés par des espaces, etc. En utiliser, comme décrit ci-dessous.
Vous devez vous connecter pour publier un commentaire.
Essayez ceci:
Avant d'exécuter une commande comme ça, j'ai souvent envie de courir d'abord ceci:
find . -name .svn -exec rm -rf '{}' \;
find . -name .svn -exec echo {} \;
{} \;
faire?ls
, je reçoisentries prop-base props text-base tmp
de sortie...find . -name .svn -exec echo {} \;
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 l'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:xargs
est assez intelligent qu'il ne fera que passer autant d'arguments pourrm
qu'il peut l'accepter. Ainsi, si vous aviez un million de fichiers, il peut exécuterrm
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}).Que les personnes ont habilement souligné, également de travail:
Les deux premiers
-exec
formes à la fois appelrm
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 derm
vous permettre de conclure la commande avec un+
indiquant querm
accepte autant d'arguments que possible: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 àrm
ou l'application en cours d'exécution.En outre, il y a un
-execdir
qui exécuterarm
à partir du répertoire dans lequel le fichier a été trouvé, plutôt que dans le répertoire de base et d'un-depth
qui va commencer parcours en profondeur d'abord.Pas besoin de tuyaux, xargs, exec, ou quoi que ce soit:
Edit: Juste une blague, évidemment
-delete
appelsunlinkat()
sous le capot, de sorte qu'il se comporte commeunlink
ourmdir
et refusera de fonctionner sur des répertoires contenant des fichiers.-delete
argument-delete
ne touche pas à un répertoire s'il contient des fichiers.-force
ou récursive drapeau pour-delete
prédicat, de sorte que cette réponse est inutile. Ainsi, il est de retour à|xargs rm -rf
, ce qui est moins laid de type-exec
avec ses laide des espaces et des point-virgule:-exec rm -rf '{}' \;
.Il y a déjà de nombreuses réponses fournies pour la suppression de l' .svn-répertoire. Mais je veux ajouter, que vous pouvez éviter ces répertoires depuis le début, si vous ne l'exportation au lieu d'un paiement:
Si vous n'aimez pas voir beaucoup de
avertissements, puis utilisez le
-depth
commutateur:C'est presque ça. Si vous souhaitez passer la sortie d'une commande en tant que paramètres à un autre, vous aurez besoin d'utiliser xargs. L'ajout de
-print0
permet de s'assurer que le script puisse gérer les chemins d'accès avec un espace:Dans Windows, vous pouvez utiliser le script de registre suivantes pour ajouter "Supprimer SVN Dossiers" à votre droite, cliquez sur le menu contextuel. L'exécuter sur n'importe quel répertoire contenant ces satanés fichiers.
Comme un problème important, lorsque vous souhaitez utiliser shell à supprimer .svn les dossiers que Vous devez -profondeur argument pour empêcher la commande rechercher entrant dans le répertoire qui vient d'être supprimé et affiche les messages d'erreur comme par exemple
Comme un résultat, Vous pouvez utiliser la commande rechercher, comme ci-dessous:
Essayez ceci:
Lire plus sur la commande rechercher à developerWorks.
Alternativement, si vous souhaitez exporter une copie sans modifier la copie de travail, vous pouvez utiliser rsync: