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?
rm
seront appelés avec les arguments [-r, a.pyc, b.pyc].**/*.pyc
alors vous n'aurez plus à vous en soucierRéponses:
la source
find . -name \*.pyc -delete
{}
. 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é?-delete
ne fait pas partie de la spécification POSIX et n'est pas garanti d'exister dans toutes les implémentations defind
.find . -name '*.pyc' -delete
Sûrement le plus simple.
la source
find
prend en charge-delete
; il ne fait pas partie du standard POSIX.__pycache__
répertoires .pyo . Voir ma réponse.-name '*.py?'
à inclure.pyo, .pyc,...
Dans la version actuelle de debian, vous avez un
pyclean
script qui est dans lepython-minimal
paquet.L'utilisation est simple:
la source
pyclean
(et maintenantpy3clean
) provient d'un paquet Debian et n'est donc pas dans RHEL.Ajoutez à votre
~/.bashrc
:Cela supprime tous les fichiers et répertoires .pyc et .pyo
__pycache__
. C'est aussi très rapide.L'utilisation est tout simplement:
la source
find . -type d -name "__pycache__" -delete
donnera souvent un avertissement sur un chemin manquant car, apparemment, le contenu sera ajouté à la file d'attente avant la suppression du dossier.2>/dev/null
devrait résoudre ce problème.Si vous utilisez bash> = 4.0 (ou zsh)
Notez que
*/*.pyc
sélectionne tous les.pyc
fichiers dans les sous-répertoires immédiats de premier niveau tout en balayant**/*.pyc
récursivement toute l'arborescence de répertoires. Par exemple,foo/bar/qux.pyc
sera supprimé parrm **/*.pyc
mais pas par*/*.pyc
.Les options du shell globstar doivent être activées. Pour activer
globstar
:et pour vérifier son statut:
la source
rm **/*.pyc
vsrm */*.pyc
? (Ce dernier semblait travailler pour moi localement.)rm */*.pyc
supprimera tous les.pyc
fichiers dans tous les sous-répertoires de profondeur 1.rm **/*.pyc
supprimera tous les.pyc
fichiers dans tous les sous-répertoires de profondeur 0+**
agit donc comme*
lors de l'exécution à la place et l'exécutionshopt globstar
génère une erreur).J'utilisais un alias pour ça:
la source
find -print0
et à laxargs -0
place.Pour les utilisateurs de Windows:
la source
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:
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.
la source
C'est plus rapide que
la source
De plus, les gens veulent généralement supprimer tous
*.pyc
,*.pyo
fichiers et__pycache__
récursive répertoires dans le répertoire courant.Commander:
la source
find
,grep
et les amis ne travaille pas là.Juste pour jeter une autre variante dans le mélange, vous pouvez également utiliser des guillemets comme celui-ci:
la source
rm
.Extension Django
L'implémentation peut être visualisée dans son code source .
la source
récursif complet
la source
**
est redondant, et comme dansd0k
la réponse de, vous devez avoir activé globstar dans bash 4+ pour que cela fonctionne comme prévu. c'est à dire faireshopt -s globstar
ou avoir cela dans l'un de vos bash sourcés. des dossiers.ll
communément aliasé à quelque chose commels -l
, mais n'est pas vraiment une commande ou portable. Donc, pour répertorier tous les.pyc
fichiers de manière récursive.
, vous devriez plutôt faire quelque chose commeecho **/*.pyc
avec globstar activéPremière exécution:
Puis ajouter:
Pour ~ / .profile
la source
si vous ne voulez plus de .pyc vous pouvez utiliser cette seule ligne dans un terminal:
si tu changes d'avis:
la source
rm -r
revient dans les répertoires, mais uniquement dans les répertoires auxquels vous donnezrm
. Il supprimera également ces répertoires. Une solution est:find
trouvera récursivement tous les fichiers * .pyc dans le répertoire courant, et lafor
boucle parcourra la liste des fichiers trouvés, en les supprimant chacun.la source
find
son-exec
prédicat:find . -name '*.pyc' -exec rm {} +
(plus agréable, plus court, plus sûr, robuste, plus efficace).la source
Vous pouvez courir
find . -name "*.pyc" -type f -delete
.Mais utilisez-le avec précaution. Exécutez d'abord
find . -name "*.pyc" -type f
pour 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.
la source
Si vous souhaitez supprimer tous les fichiers .pyc du dossier du projet.
D'abord, vous avez
puis trouvez tout le fichier .pyc et supprimez.
la source