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?


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 {} \;

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.


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 .

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

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

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 "{}"'

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

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.


16
$ find . -name '*.pyc' -delete

C'est plus rapide que

$ find . -name "*.pyc" -exec rm -rf {} \;

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

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`

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


7

récursif complet

ll **/**/*.pyc
rm **/**/*.pyc

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


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

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.


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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.