Come rimuovo tutti i file .pyc da un progetto?


678

Ho rinominato alcuni file in un progetto abbastanza grande e voglio rimuovere i file .pyc che si sono lasciati alle spalle. Ho provato lo script bash:

 rm -r *.pyc

Ma ciò non si ripercuote attraverso le cartelle come pensavo. Che cosa sto facendo di sbagliato?


11
Non funziona perché in UNIX i globs vengono espansi dalla shell, non dal programma in esecuzione. Se hai a.pyc e b.pyc nella directory corrente e le directory foo e bar, rmverranno chiamate con argomenti [-r, a.pyc, b.pyc].
effimero

1
se ti preoccupi di inviare il tuo codice ad altre persone, puoi semplicemente aggiungerlo a .gitignore, **/*.pycquindi non dovrai più preoccupartene
bubakazouba,

Risposte:


1168
find . -name "*.pyc" -exec rm -f {} \;

385
Find ha un'azione "-delete" incorporata, quindi potresti fare solofind . -name \*.pyc -delete
Christoffer,

51
Soprattutto, se si tratta di una macchina di sviluppo, è possibile impostare PYTHONDONTWRITEBYTECODE = True e non sarà più necessario farlo di nuovo. Vedi: questa risposta .
mlissner,

5
Non stai citando {}. Cosa succederebbe se accidentalmente si dividesse una parola e cancellasse un percorso intermedio che sembra essere chiamato come un frammento del percorso che hai trovato?
Robottinosino,

20
-deletenon fa parte delle specifiche POSIX e non è garantito che esista in tutte le implementazioni di find.
Chepner,

7
Se sei spaventato - il che potrebbe essere buono - fai un primo passaggio con -exec echo {}, oppure - se sei molto spaventato - usa rm -i {} che ti chiede ogni volta o rm - v {} in modo da vedere cosa tu elimini.
gennaio

1021

find . -name '*.pyc' -delete

Sicuramente il più semplice.


21
Se la tua versione di findsupporti -delete; non fa parte dello standard POSIX.
Chepner,

4
Ciò ignora i file e le __pycache__directory .pyo . Vedi la mia risposta
Wilfred Hughes

Ho usato il codice dalla risposta accettata e ha funzionato, ma questi comandi sono più brevi e semplici
Dap

3
-name '*.py?'da includere.pyo, .pyc,...
cdosborn

2
ASSICURARSI che l'eliminazione sia l'ultima cosa nel comando. Ho accidentalmente messo -delete subito dopo il ritrovamento. Ha cancellato tutto!
thinkanotherone,

85

Nella versione corrente di debian hai lo pycleanscript che è nel python-minimalpacchetto.

L'uso è semplice:

pyclean .

34
Vale la pena notare che Pyclean sembra eliminare solo i file .pyc per i quali esiste un file .py corrispondente (almeno sul mio sistema - Ubuntu 12.10.) Ciò significa che non è molto utile nelle situazioni in cui un file sorgente è stato eliminato e si desidera per ripulire i file .pyc rimanenti.
tigerFinch

@holms pyclean(e ora py3clean) hanno origine in un pacchetto Debian e quindi non sono in RHEL.
duozmo,

83

Aggiungi a ~/.bashrc:

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

Ciò rimuove tutti i file .pyc e .pyo e __pycache__ directory. È anche molto veloce.

L'utilizzo è semplicemente:

$ cd /path/to/directory
$ pyclean

find . -type d -name "__pycache__" -deletefornirà spesso un avviso su un percorso mancante perché apparentemente il contenuto verrà aggiunto alla coda prima dell'eliminazione della cartella. 2>/dev/nulldovrebbe risolverlo.
Fisico pazzo,

53

Se stai usando bash> = 4.0 (o zsh)

rm **/*.pyc

Si noti che */*.pycseleziona tutti i .pycfile nelle sottodirectory immediate di primo livello mentre **/*.pycesegue la scansione ricorsiva dell'intero albero di directory. Ad esempio, foo/bar/qux.pycverrà eliminato da rm **/*.pycma non da*/*.pyc .

Le opzioni della shell globstar devono essere abilitate. Per abilitare globstar:

shopt -s globstar

e per controllarne lo stato:

shopt globstar

1
Qual è la differenza nella corsa rm **/*.pycvs rm */*.pyc? (Quest'ultimo sembrava funzionare localmente per me.)
Taylor Edmiston,

1
@TaylorEdmiston rm */*.pyceliminerà tutti i .pycfile in tutte le sottodirectory di profondità 1. rm **/*.pyceliminerà tutti i .pycfile in tutte le sottodirectory di profondità 0+
Adam Stewart,

@AdamStewart Grazie per averlo aggiunto. Per altri inciampando in questo thread, il problema che stavo riscontrando era che la bash di Apple fornita con OS X non include globstar (quindi **agisce come *quando viene eseguita invece e in esecuzione shopt globstargenera un errore).
Taylor Edmiston,

30

Per questo usavo un alias:

$ which pycclean

pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'

12
Nell'attuale debian è ciclico.
jb.

7
Questo non si occupa bene degli spazi bianchi nei nomi dei file. Dovresti usare find -print0e xargs -0invece.
r3m0t

2
Perché dovresti avere un codice Python con spazi nei nomi di file / cartelle? Sintatticamente è legale?
coredumperror,

@CoreDumpError, sì, infatti su Windows Python si installa in una directory con spazi ("Programmi").
Paul Draper,

L'interprete Python può essere installato lì per impostazione predefinita, ma non è certo un buon posto per inserire il codice . Inoltre, sicuramente non vorresti che la cartella Programmi fosse parte della struttura del tuo pacchetto, motivo per cui ero diffidente riguardo alla sintassi.
coredumperror,

24

Per gli utenti di Windows:

del /S *.pyc

Metterlo in uno script batch rende le cose super facili. Grazie.
Nick Gotch,

E se sei su Powershell, questo può essere usato con "cmd" -> Esegui comando -> "esci".
np8,

18
find . -name '*.pyc' -print0 | xargs -0 rm

La ricerca cerca ricorsivamente i file * .pyc. Xargs prende quell'elenco di nomi e lo invia a rm. -Print0 e -0 indicano ai due comandi di separare i nomi dei file con caratteri null. Ciò gli consente di funzionare correttamente sui nomi di file contenenti spazi e persino su un nome di file contenente una nuova riga.

La soluzione con -exec funziona, ma crea una nuova copia di rm per ogni file. Su un sistema lento o con molti file, ci vorrà troppo tempo.

Puoi anche aggiungere un altro paio di argomenti:

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

iname aggiunge insensibilità al maiuscolo / minuscolo, come * .PYC. No-run-if-empty ti impedisce di ottenere un errore da rm se non hai tali file.


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

Questo è più veloce di

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

11

Inoltre, la gente di solito vuole rimuovere tutti *.pyc, *.pyoi file e__pycache__ le directory ricorsivamente nella directory corrente.

Comando:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

Questa è una buona risposta, ma una semplice soluzione Python sarebbe multipiattaforma e quindi preferibile. Mentre, personalmente, non mi interessa su Windows probabilmente la metà della popolazione vive al di Python su Windows - e find, grepe gli amici non vi lavorano.
Peterino,

Lo fanno se si installa la strumentazione. Consiglio a tutti gli utenti della CLI di Windows di farlo per facilitare la compatibilità incrociata: superuser.com/questions/168202/…
DylanYoung,

8

Solo per aggiungere un'altra variante al mix, puoi anche usare backquotes in questo modo:

rm `find . -name *.pyc`

5
Questo ha il leggero inconveniente di fallire se ci sono troppe corrispondenze, poiché ci saranno troppi argomenti a cui passare rm.
Chepner,


7

pieno ricorsivo

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

Interessante, come si confronta con le risposte di Andy e Bill?
Austin Henley,

3
Un set di **è ridondante e, come nella d0krisposta, è necessario che globstar sia abilitato in bash 4+ affinché funzioni come previsto. cioè fare shopt -s globstaro avere quello in uno dei tuoi bash di provenienza. File.
Ripristina Monica, per favore, il

1
Inoltre llè comunemente aliasato a qualcosa del genere ls -l, ma in realtà non è un comando o portatile. Quindi, per elencare in modo ricorsivo tutti i .pycfile ., dovresti invece fare qualcosa di simile echo **/*.pyccon globstar abilitato
Ripristina Monica Please

3

Prima corsa:

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

Quindi aggiungere:

export PYTHONDONTWRITEBYTECODE=1

A ~ / .profile


3

se non vuoi più .pyc puoi usare questa singola linea in un terminale:

export PYTHONDONTWRITEBYTECODE=1

se cambi idea:

unset PYTHONDONTWRITEBYTECODE

2

rm -rricorre nelle directory, ma solo le directory a cui dai rm. Eliminerà anche quelle directory. Una soluzione è:

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

findtroverà ricorsivamente tutti i file * .pyc nella directory corrente e il forciclo scorrerà l'elenco dei file trovati, rimuovendoli ciascuno.


Questo funziona anche se devo metterlo in un file .sh ed eseguirlo (che va bene per me, userò questo comando più di una volta)
Teifion

Credo che mettere tutto su una riga separata da ';' dovrebbe consentirti di eseguirlo sulla shell. Ma quando lo digito in bash, bash attende che il "done" alla fine esegua qualsiasi cosa ...
Chris Lutz,

È un antipasto terribile (e anche molto comune, vorrei che potesse scomparire): si rompe con nomi di file contenenti spazi o caratteri glob. E manca il punto findcon il suo -execpredicato: find . -name '*.pyc' -exec rm {} +(più bello, più corto, più sicuro, robusto, più efficiente).
gniourf_gniourf


1

Puoi correre find . -name "*.pyc" -type f -delete.

Ma usalo con precauzione. Esegui prima find . -name "*.pyc" -type fper vedere esattamente quali file rimuoverai.

Inoltre, assicurati che -delete sia l'ultimo argomento nel tuo comando. Se lo metti prima dell'argomento -name * .pyc, cancellerà tutto.


1

Se si desidera eliminare tutti i file .pyc dalla cartella del progetto.

Prima di tutto

cd <path/to/the/folder>

quindi trova tutto il file .pyc ed elimina.

find . -name \*.pyc -delete
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.