L'une des missions d'un outil d'export que j'ai dans mon application, est de nettoyer tous les .svn
répertoires de l'arborescence des répertoires de mon application. Je recherche une commande récursive dans le shell Linux qui traversera l'arborescence entière et supprimera les .svn
fichiers.
Je n'utilise pas l'exportation, car ce script sera utilisé pour certains autres noms de fichiers / répertoires qui ne sont pas liés à SVN. J'ai essayé quelque chose comme:
find . -name .svn | rm -fr
Ça n'a pas marché ...
Réponses:
Essaye ça:
find . -name .svn -exec rm -rf '{}' \;
Avant d'exécuter une commande comme celle-ci, j'aime souvent l'exécuter en premier:
find . -name .svn -exec ls '{}' \;
la source
find . -name .svn -exec rm -rf '{}' \;
find . -name .svn -exec echo {} \;
{} \;
?ls
, j'obtiens laentries prop-base props text-base tmp
sortie ...Ce que vous avez écrit envoie une liste de noms de fichiers (et de chemins) séparés par une nouvelle ligne
rm
, mais rm ne sait pas quoi faire avec cette entrée. Il n'attend que des paramètres de ligne de commande.xargs
prend des entrées, généralement séparées par des retours à la ligne, et les place sur la ligne de commande, donc l'ajout de xargs fait fonctionner ce que vous aviez:xargs
est suffisamment intelligent pour ne transmettre que le nombre d'argumentsrm
qu'il peut accepter. Ainsi, si vous aviez un million de fichiers, il pourrait s'exécuterrm
1 000 000/65 000 fois (si votre shell pouvait accepter 65 002 arguments sur la ligne de commande {65k fichiers + 1 pour rm + 1 pour -fr}).Comme des personnes l'ont habilement souligné, les éléments suivants fonctionnent également:
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
formulaires appellent tous les deuxrm
pour chaque dossier en cours de suppression, donc si vous aviez 1 000 000 de dossiers,rm
ils seraient appelés 1 000 000 fois. C'est certainement loin d'être idéal. Les nouvelles implémentations derm
vous permettent de conclure la commande avec un+
indicateur quirm
acceptera autant d'arguments que possible:find . -name .svn -exec rm -rf {} +
La dernière version de find / xargs utilise print0, ce qui permet à find de générer une sortie qui l'utilise
\0
comme terminateur plutôt que comme nouvelle ligne. Puisque les systèmes POSIX autorisent n'importe quel caractère sauf\0
dans le nom de fichier, c'est vraiment le moyen le plus sûr de s'assurer que les arguments sont correctement passés àrm
ou à l'application en cours d'exécution.De plus, il y a un
-execdir
qui s'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 démarrera en premier.la source
Pas besoin de tubes, xargs, exec ou quoi que ce soit:
Edit: Je plaisante,
-delete
appelle évidemmentunlinkat()
sous le capot, donc il se comporte commeunlink
ourmdir
et refusera de fonctionner sur des répertoires contenant des fichiers.la source
-delete
ne touchera pas un répertoire s'il contient des fichiers.-force
indicateur ou d'indicateur récursif pour le-delete
prédicat, donc cette réponse est inutile. Ainsi, il est de retour à|xargs rm -rf
, ce qui est moins laide à taper alors-exec
avec ses espaces réservés laid et Virgule:-exec rm -rf '{}' \;
.Il existe déjà de nombreuses réponses pour supprimer le répertoire .svn. Mais je tiens à ajouter que vous pouvez éviter ces répertoires dès le début, si vous effectuez une exportation au lieu d'une extraction:
svn export <url>
la source
Si vous n'aimez pas voir beaucoup de
find: `./.svn': No such file or directory
avertissements, puis utilisez le
-depth
commutateur:find . -depth -name .svn -exec rm -fr {} \;
la source
Sous Windows, vous pouvez utiliser le script de registre suivant pour ajouter «Supprimer les dossiers SVN» à votre menu contextuel de clic droit. Exécutez-le sur n'importe quel répertoire contenant ces fichiers embêtants.
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\" \""
la source
Vous l'avez presque eu. Si vous voulez passer la sortie d'une commande en tant que paramètres à une autre, vous devrez utiliser xargs. L'ajout
-print0
garantit que le script peut gérer les chemins avec des espaces:find . -type d -name .svn -print0|xargs -0 rm -rf
la source
la source
En tant que problème important, lorsque vous souhaitez utiliser le shell pour supprimer les dossiers .svn, 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 tels que
"find: ./.svn: No such file or directory"
En conséquence, vous pouvez utiliser la commande find comme ci-dessous:
cd [dir_to_delete_svn_folders] find . -depth -name .svn -exec rm -fr {} \;
la source
Essaye ça:
find . -name .svn -exec rm -v {} \;
En savoir plus sur la commande find sur developerWorks .
la source
Sinon, si vous souhaitez exporter une copie sans modifier la copie de travail, vous pouvez utiliser rsync:
rsync -a --exclude .svn path/to/working/copy path/to/export
la source