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é...
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 '{}' \;
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.
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.
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 {} \;
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>
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
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\" \""
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 {} \;
essayez ceci:
find . -name .svn -exec rm -v {} \;
pour en savoir plus sur la commande developerWorks .
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