J'émets la commande suivante pour trouver les répertoires .svn:
find . -name ".svn"
Cela me donne les résultats suivants:
./toto/.svn
./toto/titi/.svn
./toto/tata/.svn
Comment pourrais-je traiter toutes ces lignes rm -fr
afin de supprimer les répertoires et leur contenu?
find
rm
subversion
Arnaud
la source
la source
-delete
option.-exec rm -r "{}" \;
à la fin de la recherche - soyez prudent lorsque vous utilisezrm -r
! :)-name ".svn"
il correspond uniquement au.svn
répertoire lui-même et non aux fichiers situés dans le.svn
répertoire.-exec
avec quoted"{}"
).Réponses:
Find peut exécuter des arguments avec l'
-exec
option pour chaque correspondance trouvée. C'est un mécanisme recommandé car vous pouvez gérer correctement les chemins contenant des espaces / nouvelles lignes et d'autres caractères. Vous devrez supprimer le contenu du répertoire avant de pouvoir le supprimer lui-même; utilisez donc-r
larm
commande pour y parvenir.Pour votre exemple, vous pouvez émettre:
Vous pouvez également demander à find de trouver uniquement les répertoires nommés .svn en ajoutant une
-type d
coche:Avertissement Utilisez
rm -r
avec précaution pour supprimer le dossier et tout son contenu.Si vous souhaitez supprimer uniquement les répertoires vides ainsi que ceux contenant uniquement des répertoires vides, find peut le faire lui-même avec
-delete
et-empty
:la source
-type
après-name
dans les commandes find, puisque les appelsstat
à obtenir le type coûtent cher. Je viens de l'essayer moi-même sur un assez grand nombre de fichiers, et cela semble être vrai: courir afind . -name 'foo' -type d
pris 19 secondes, alors qu'il afind . -type d -name 'foo'
fallu 32 secondes. Donc, environ 50% plus de temps pour courir en-type
premier.find
veut voir dans ce dossier pour d'autres correspondances, alors qu'il supprime le dossier en même temps. ~ Je ne sais pas encore comment résoudre ce problème. ~ Correction du problème:find . -name "folder-to-delete" -print0 | xargs -r0 -- rm -r
-depth
argument résout ce problème:find . -depth -name ".svn" -type d -exec rm -r "{}" \;
Voici un portable encore plus rapide que le moyen de réponse accepté.
Utiliser un
+
point-virgule au lieu d'un point-virgule commefind
terminateur de commande optimise l'utilisation du processeur. Cela peut être important si vous avez beaucoup de.svn
sous-répertoires:Notez également que vous ne 1 besoin de citer les accolades ici.
1 Sauf si vous utilisez le
fish
shell.la source
+
ne réduit pas l'utilisation du processeur. L'utilisation;
n'entraîne pas d'erreur de commande trop longue.Supposons que vous utilisez gnu find , vous pouvez utiliser l'
-delete
option:ce qui est plus facile à retenir.
la source
Sur mon ordinateur quand j'utilise:
Les répertoires sont supprimés mais j'obtiens l'erreur:
pour chaque répertoire.
Mes répertoires ne sont pas vides, donc l'option -delete ne fonctionnera pas pour moi. J'ai trouvé la raison de ce comportement ici :
J'ai utilisé cela à la place pour contourner:
Gardez à l'esprit que find essaiera toujours de recurse dans des répertoires nommés dirname, ce qui n'est pas vraiment nécessaire et prendra un peu plus de temps. En fonction de la structure de votre répertoire, vous pourrez peut-être contourner ce problème avec l'
--depth
option de recherche. De plus, si vous avez une structure de répertoires telle que dirname / foo / dirname, vous obtiendrez des erreurs "Aucun fichier ou répertoire de ce type" de la part de rm. Pour supprimer les erreurs, vous pouvez rediriger stderr vers / dev / null ou utiliser le-f
drapeau (force) avec rm.la source
find . -name "to-delete" -print0 | xargs -r0 -- rm -r
est une version infaillible qui ne plante pas dans les espaces-prune
.-prune
pour éviter l'erreur "Aucun fichier ou répertoire de ce type".Un moyen plus rapide de faire ceci est:
Si vous avez ".svn" dans un autre ".svn".
la source
Solution spécifique Bash:
la source
bash: /bin/rm: Argument list too long
J'ai trouvé que l'
-delete
action fonctionne bien avec le-path
test. Par exemple, les éléments suivants doivent résoudre le problème des affiches originales:la source
-delete
implique-depth
et supprime bien les répertoires non vides de mon système.