Comment supprimer tous les fichiers .pyc d'un projet?

678

J'ai renommé certains fichiers dans un projet assez volumineux et je souhaite supprimer les fichiers .pyc qu'ils ont laissés. J'ai essayé le script bash:

 rm -r *.pyc

Mais cela ne revient pas dans les dossiers comme je le pensais. Qu'est-ce que je fais mal?

Teifion
la source
11
Cela ne fonctionne pas car sous UNIX, les globes sont développés par le shell, et non par le programme en cours d'exécution. Si vous avez a.pyc et b.pyc dans le répertoire courant, et que les répertoires foo et bar rmseront appelés avec les arguments [-r, a.pyc, b.pyc].
éphémère le
1
si vous vous inquiétez de pousser votre code à d'autres personnes, vous pouvez simplement l'ajouter au .gitignore **/*.pycalors vous n'aurez plus à vous en soucier
bubakazouba

Réponses:

1168
find . -name "*.pyc" -exec rm -f {} \;
Bill le lézard
la source
385
Find a une action "-delete" intégrée, donc vous pouvez faire justefind . -name \*.pyc -delete
Christoffer
51
Plus important encore, s'il s'agit d'une machine de développement, vous pouvez définir PYTHONDONTWRITEBYTECODE = True, et vous n'aurez plus jamais besoin de le faire. Voir: cette réponse .
mlissner
5
Vous ne citez pas {}. Que se passerait-il si accidentellement le mot était divisé et supprimé un chemin intermédiaire qui se trouve être appelé comme un fragment du chemin que vous avez trouvé?
Robottinosino
20
-deletene fait pas partie de la spécification POSIX et n'est pas garanti d'exister dans toutes les implémentations de find.
chepner
7
Si vous avez peur - ce qui pourrait être bon - faites une première passe avec -exec echo {}, ou - si vous avez très peur - utilisez rm -i {} qui vous le demande à chaque fois ou rm - v {} pour voir ce que vous supprimez.
jeanM
1021

find . -name '*.pyc' -delete

Sûrement le plus simple.

Andy Baker
la source
21
Si votre version de findprend en charge -delete; il ne fait pas partie du standard POSIX.
chepner
4
Cela ignore les fichiers et __pycache__répertoires .pyo . Voir ma réponse.
Wilfred Hughes
J'ai utilisé le code de la réponse acceptée et cela a fonctionné, mais ces commandes sont plus courtes et simples
Dap
3
-name '*.py?'à inclure.pyo, .pyc,...
cdosborn
2
Assurez-vous que la suppression est la dernière chose dans la commande. J'ai accidentellement mis -delete juste après la découverte. Il a tout supprimé!
thinkanotherone
85

Dans la version actuelle de debian, vous avez un pycleanscript qui est dans le python-minimalpaquet.

L'utilisation est simple:

pyclean .
jb.
la source
34
Il convient de noter que pyclean semble supprimer uniquement les fichiers .pyc pour lesquels il existe un fichier .py correspondant (au moins sur mon système - ubuntu 12.10.) Cela signifie que ce n'est pas très utile dans les situations où un fichier source a été supprimé et que vous souhaitez pour nettoyer les fichiers .pyc restants.
tigerFinch
@holms pyclean(et maintenant py3clean) provient d'un paquet Debian et n'est donc pas dans RHEL.
duozmo
83

Ajoutez à votre ~/.bashrc:

pyclean () {
        find . -type f -name "*.py[co]" -delete
        find . -type d -name "__pycache__" -delete
}

Cela supprime tous les fichiers et répertoires .pyc et .pyo __pycache__. C'est aussi très rapide.

L'utilisation est tout simplement:

$ cd /path/to/directory
$ pyclean
Wilfred Hughes
la source
find . -type d -name "__pycache__" -deletedonnera souvent un avertissement sur un chemin manquant car, apparemment, le contenu sera ajouté à la file d'attente avant la suppression du dossier. 2>/dev/nulldevrait résoudre ce problème.
Mad Physicist
53

Si vous utilisez bash> = 4.0 (ou zsh)

rm **/*.pyc

Notez que */*.pycsélectionne tous les .pycfichiers dans les sous-répertoires immédiats de premier niveau tout en balayant **/*.pycrécursivement toute l'arborescence de répertoires. Par exemple, foo/bar/qux.pycsera supprimé par rm **/*.pycmais pas par */*.pyc.

Les options du shell globstar doivent être activées. Pour activer globstar:

shopt -s globstar

et pour vérifier son statut:

shopt globstar
d0k
la source
1
Quelle est la différence entre courir rm **/*.pycvs rm */*.pyc? (Ce dernier semblait travailler pour moi localement.)
Taylor Edmiston
1
@TaylorEdmiston rm */*.pycsupprimera tous les .pycfichiers dans tous les sous-répertoires de profondeur 1. rm **/*.pycsupprimera tous les .pycfichiers dans tous les sous-répertoires de profondeur 0+
Adam Stewart
@AdamStewart Merci d'avoir ajouté ceci. Pour d'autres qui tombent sur ce sujet, le problème que je rencontrais était que le bash d'Apple livré avec OS X n'inclut pas globstar ( **agit donc comme *lors de l'exécution à la place et l'exécution shopt globstargénère une erreur).
Taylor Edmiston
30

J'utilisais un alias pour ça:

$ which pycclean

pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'
miku
la source
12
Dans le debian actuel, il est pycléen.
jb.
7
Cela ne traite pas bien les espaces dans les noms de fichiers. Vous devez utiliser find -print0et à la xargs -0place.
r3m0t
2
Pourquoi voudriez-vous avoir du code python avec des espaces dans les noms de fichiers / dossiers? Est-ce syntaxiquement légal?
coredumperror
@CoreDumpError, oui, en fait sur Windows Python s'installe dans un répertoire avec des espaces ("Program Files").
Paul Draper
L'interpréteur python peut s'y installer par défaut, mais ce n'est pas un bon endroit pour mettre votre code . De plus, vous ne voudriez certainement pas que le dossier Program Files fasse partie de la structure de votre package, c'est pourquoi je me méfiais de la syntaxe.
coredumperror
24

Pour les utilisateurs de Windows:

del /S *.pyc
haki
la source
Mettre cela dans un script batch rend les choses super faciles. Merci.
Nick Gotch
Et si vous êtes sur Powershell, cela peut être utilisé avec "cmd" -> Exécuter la commande -> "Quitter".
np8
18
find . -name '*.pyc' -print0 | xargs -0 rm

La recherche recherche récursivement les fichiers * .pyc. Le xargs prend cette liste de noms et l'envoie à rm. -Print0 et -0 indiquent aux deux commandes de séparer les noms de fichiers avec des caractères nuls. Cela lui permet de fonctionner correctement sur les noms de fichiers contenant des espaces, et même sur un nom de fichier contenant une nouvelle ligne.

La solution avec -exec fonctionne, mais elle génère une nouvelle copie de rm pour chaque fichier. Sur un système lent ou avec un grand nombre de fichiers, cela prendra trop de temps.

Vous pouvez également ajouter quelques arguments supplémentaires:

find . -iname '*.pyc' -print0 | xargs -0 --no-run-if-empty  rm

iname ajoute une insensibilité à la casse, comme * .PYC. Le no-run-if-empty vous empêche d'obtenir une erreur de rm si vous n'avez pas de tels fichiers.

Ron Romero
la source
16
$ find . -name '*.pyc' -delete

C'est plus rapide que

$ find . -name "*.pyc" -exec rm -rf {} \;
Moxdata
la source
11

De plus, les gens veulent généralement supprimer tous *.pyc, *.pyofichiers et __pycache__récursive répertoires dans le répertoire courant.

Commander:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Mithril
la source
C'est une bonne réponse, mais une solution Python simple serait multiplateforme et donc préférable. Bien que, personnellement, je ne me soucie pas de Windows probablement la moitié de la vie de la population Python sous Windows - et find, grepet les amis ne travaille pas là.
Peterino
Ils le font si vous installez l'outillage. Je recommanderais à tous les utilisateurs de Windows de le faire pour faciliter la
compatibilité
8

Juste pour jeter une autre variante dans le mélange, vous pouvez également utiliser des guillemets comme celui-ci:

rm `find . -name *.pyc`
Clint Miller
la source
5
Cela a le léger inconvénient d'échouer s'il y a trop de correspondances, car il y aura trop d'arguments à passer rm.
chepner
8

Extension Django

Remarque: Cette réponse est très spécifique au projet Django qui a déjà utilisé Django Extension .

python manage.py clean_pyc

L'implémentation peut être visualisée dans son code source .

Yeo
la source
7

récursif complet

ll **/**/*.pyc
rm **/**/*.pyc
romuloigor
la source
Intéressant, comment cela se compare-t-il aux réponses d'Andy et Bill?
Austin Henley
3
Un ensemble de **est redondant, et comme dans d0kla réponse de, vous devez avoir activé globstar dans bash 4+ pour que cela fonctionne comme prévu. c'est à dire faire shopt -s globstarou avoir cela dans l'un de vos bash sourcés. des dossiers.
Réinstallez Monica Please le
1
Est également llcommunément aliasé à quelque chose comme ls -l, mais n'est pas vraiment une commande ou portable. Donc, pour répertorier tous les .pycfichiers de manière récursive ., vous devriez plutôt faire quelque chose comme echo **/*.pycavec globstar activé
Monica Please
3

Première exécution:

find . -type f -name "*.py[c|o]" -exec rm -f {} +

Puis ajouter:

export PYTHONDONTWRITEBYTECODE=1

Pour ~ / .profile

Michael Bénin
la source
3

si vous ne voulez plus de .pyc vous pouvez utiliser cette seule ligne dans un terminal:

export PYTHONDONTWRITEBYTECODE=1

si tu changes d'avis:

unset PYTHONDONTWRITEBYTECODE
Kevin Sabbe
la source
2

rm -rrevient dans les répertoires, mais uniquement dans les répertoires auxquels vous donnez rm. Il supprimera également ces répertoires. Une solution est:

for i in $( find . -name *.pyc )
do
  rm $i
done

findtrouvera récursivement tous les fichiers * .pyc dans le répertoire courant, et la forboucle parcourra la liste des fichiers trouvés, en les supprimant chacun.

Chris Lutz
la source
Celui-ci fonctionne bien que je doive le mettre dans un fichier .sh et l'exécuter (ce qui me convient, je vais utiliser cette commande plus d'une fois)
Teifion
Je crois que tout mettre sur une ligne séparée par des ';' devrait vous permettre de l'exécuter sur le shell. Mais quand je tape ça dans bash, bash attend le "fait" à la fin pour exécuter quoi que ce soit ...
Chris Lutz
C'est un horrible contre- modèle (et très courant aussi, je souhaite qu'il puisse disparaître): il rompt avec les noms de fichiers contenant des espaces ou des caractères globaux. Et il manque le point de findson -execprédicat: find . -name '*.pyc' -exec rm {} +(plus agréable, plus court, plus sûr, robuste, plus efficace).
gniourf_gniourf
2
find . -name "*.pyc"|xargs rm -rf
PiyusG
la source
1

Vous pouvez courir find . -name "*.pyc" -type f -delete.

Mais utilisez-le avec précaution. Exécutez d'abord find . -name "*.pyc" -type fpour voir exactement quels fichiers vous supprimerez.

De plus, assurez-vous que -delete est le dernier argument de votre commande. Si vous le mettez avant l'argument -name * .pyc, il supprimera tout.

gpap
la source
1

Si vous souhaitez supprimer tous les fichiers .pyc du dossier du projet.

D'abord, vous avez

cd <path/to/the/folder>

puis trouvez tout le fichier .pyc et supprimez.

find . -name \*.pyc -delete
Girish Vas
la source