Bir projeden tüm .pyc dosyalarını nasıl kaldırabilirim?


677

Bazı dosyaları oldukça büyük bir projede yeniden adlandırdım ve geride bıraktıkları .pyc dosyalarını kaldırmak istiyorum. Ben bash betiği denedim:

 rm -r *.pyc

Ama bu düşündüğüm gibi klasörler arasında geçerli değil. Neyi yanlış yapıyorum?


11
Çalışmıyor çünkü UNIX'te globlar çalıştırılan program tarafından değil, kabuk tarafından genişletiliyor. Geçerli dizinde a.pyc ve b.pyc varsa ve foo ve bar dizinleri, rm[-r, a.pyc, b.pyc] bağımsız değişkenleriyle çağrılır.
ephemient

1
kodunuzu başkalarına aktarmaktan endişe ediyorsanız, sadece .gitignore'a ekleyebilirsiniz, o **/*.pyczaman tekrar endişelenmenize gerek
kalmaz

Yanıtlar:


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

385
Bulun yerleşik bir "silme" eylemi vardır, bu yüzden bunu yapabilirsinizfind . -name \*.pyc -delete
Christoffer

51
En önemlisi, bu bir dev makinesi ise, PYTHONDONTWRITEBYTECODE = True olarak ayarlayabilirsiniz ve bunu bir daha asla yapmanıza gerek yoktur. Bakınız: bu cevap .
mlissner

5
Alıntı yapmıyorsunuz {}. Bulduğunuz yolun bir parçası gibi adlandırılan bir ara yolu yanlışlıkla kelime olarak böler ve silerse ne olur?
Robottinosino

20
-delete, POSIX belirtiminin bir parçası değildir ve öğesinin tüm uygulamalarında bulunacağı garanti edilmez find.
chepner

7
Eğer korkarsanız - ki bu iyi olabilir - -exec echo {} ile ilk geçiş yapın ya da - çok iyiyseniz korkuyorsanız - size her seferinde soran rm -i {} kullanın ya da her seferinde rm - v {} kullanın. sen sil.
jeanM

1021

find . -name '*.pyc' -delete

Kesinlikle en basit.


21
Sürümünüz finddestekliyorsa -delete; POSIX standardının bir parçası değildir.
chepner

4
Bu, .pyo dosyalarını ve __pycache__dizinlerini yok sayar . Cevabımı gör.
Wilfred Hughes

Kabul edilen cevaptaki kodu kullandım ve işe yaradı, ancak bu komutlar daha kısa ve basit
Dap

3
-name '*.py?'dahil etmek.pyo, .pyc,...
cdosborn

2
EMİN OLUN -delete komuttaki son şeydir. Yanlışlıkla bulduktan hemen sonra -delete. Her şeyi sildi!
thinkanotherone

85

Debian'ın şu anki sürümünde pakette pycleanbulunan bir komut dosyası var python-minimal.

Kullanımı basit:

pyclean .

34
Pyclean'ın yalnızca karşılık gelen bir .py dosyasının bulunduğu .pyc dosyalarını sildiğini belirtmek gerekir (en azından sistemimde - ubuntu 12.10.) Bu, bir kaynak dosyanın silindiği ve istediğiniz durumlarda çok yararlı olmadığı anlamına gelir. artık .pyc dosyalarını temizlemek için.
tigerFinch

@holms pyclean(ve şimdi py3clean) bir Debian paketinden kaynaklanmaktadır ve bu nedenle RHEL içinde değildir.
duozmo

83

Ekle ~/.bashrc:

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

Bu, tüm .pyc ve .pyo dosyalarını ve __pycache__dizinlerini kaldırır . Aynı zamanda çok hızlı.

Kullanımı basit:

$ cd /path/to/directory
$ pyclean

find . -type d -name "__pycache__" -deleteGörünüşe göre içerikler klasör silinmeden önce kuyruğa ekleneceği için genellikle eksik bir yol hakkında uyarı verir. 2>/dev/nullBunu düzeltmeli.
Mad Physicist

53

Bash = = 4.0 (veya zsh) kullanıyorsanız

rm **/*.pyc

Tüm dizin ağacını özyinelemeli olarak tararken, birinci düzey alt dizinlerdeki */*.pyctüm .pycdosyaları seçtiğini unutmayın **/*.pyc. Örnek olarak, foo/bar/qux.pyctarafından silinecek rm **/*.pycancak tarafından silinmeyecek*/*.pyc .

Globstar kabuk seçenekleri etkinleştirilmelidir. Etkinleştirmek için globstar:

shopt -s globstar

ve durumunu kontrol etmek için:

shopt globstar

1
rm **/*.pycVs ile çalışan arasındaki fark nedir rm */*.pyc? (İkincisi benim için yerel olarak çalışıyor gibiydi.)
Taylor Edmiston

1
@TaylorEdmiston rm */*.pycsilinir.BREAKBREAKDevam .pycderinlik 1. tüm alt dizinleri dosyaları rm **/*.pycsilinir.BREAKBREAKDevam .pyc0+ derinlik tüm alt dizinleri dosyaları
Adam Stewart

@AdamStewart Bunu eklediğiniz için teşekkür ederiz. Bu iş parçacığında tökezleyen diğerleri için, yaşadığım sorun, Apple'ın OS X ile birlikte gelen bashının globstar içermediğiydi (bu yüzden bunun yerine çalıştırıldığında **olduğu gibi *çalışıyor ve shopt globstarbir hata atıyor).
Taylor Edmiston

30

Bunun için bir takma ad kullanırdım:

$ which pycclean

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

12
Mevcut debian'da pyclean.
jb.

7
Bu, dosya adlarındaki boşluklarla iyi ilgilenmez. Bunun yerine find -print0ve xargs -0kullanmalısınız.
r3m0t

2
Neden dosya / klasör adlarında boşluklar olan python koduna sahip olmak istiyorsunuz? Sözdizimsel olarak yasal mı?
coredumperror

@CoreDumpError, evet, aslında Windows Python boşluklu bir dizine ("Program Files") yüklenir.
Paul Draper

Python yorumlayıcısı varsayılan olarak oraya kurulabilir, ancak kodunuzu koymak için iyi bir yer değildir . Ayrıca, kesinlikle Program Files klasörünün paket yapınızın bir parçası olmasını istemezsiniz, bu yüzden sözdizimi konusunda ihtiyatlıydım.
coredumperror

24

Windows kullanıcıları için:

del /S *.pyc

Bunu toplu bir senaryoya koymak işleri kolaylaştırır. Teşekkürler.
Nick Gotch

Powershell üzerindeyseniz, bu "cmd" -> Çalıştırma komutu -> "çıkış" ile kullanılabilir.
np8

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

Bulma, * .pyc dosyalarını özyinelemeli olarak arar. Xargs bu isim listesini alır ve rm'ye gönderir. -Print0 ve -0, iki komuta dosya adlarını boş karakterlerle ayırmasını söyler. Bu, boşluk içeren dosya adlarında ve hatta yeni bir satır içeren bir dosya adında düzgün çalışmasını sağlar.

-Exec ile çözüm çalışır, ancak her dosya için yeni bir rm kopyası döndürür. Yavaş bir sistemde veya çok sayıda dosyayla, bu çok uzun sürecektir.

Ayrıca birkaç argüman daha ekleyebilirsiniz:

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

iname, * .PYC gibi büyük / küçük harfe duyarsızlık ekler. No-run-if-empty, bu tür dosyalarınız yoksa rm'den hata almanızı engeller.


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

Bu daha hızlı

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

11

Dahası, insanlar genellikle tüm kaldırmak istiyor *.pyc, *.pyodosya ve __pycache__geçerli dizinde dizinleri akıcı.

Komut:

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

Bu iyi bir cevaptır, ancak sade bir Python çözümü platformlar arası olabilir ve bu nedenle tercih edilir. Şahsen ben muhtemelen yarısı Windows üzerinde Python nüfus hayatlarının Windows'un umurumda değil iken - ve find, grepve arkadaşlar orada çalışmaz.
Peterino

Aletleri takarsanız yaparlar. Her windows CLI kullanıcısının çapraz
uyumu

8

Sadece karışıma başka bir varyant atmak için, bunun gibi geri tırnaklar da kullanabilirsiniz:

rm `find . -name *.pyc`

5
Çok fazla eşleşme varsa, başarısız olmanın hafif bir dezavantajı vardır, çünkü geçilecek çok fazla argüman olacaktır rm.
chepner


7

tam özyinelemeli

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

İlginçtir, bu Andy ve Bill'in cevaplarıyla nasıl karşılaştırılır?
Austin Henley

3
Bir küme **gereksizdir ve d0kyanıtında olduğu gibi, bunun amaçlandığı gibi çalışması için bash 4 + 'da globstar'ı etkinleştirmeniz gerekir. yani bunu shopt -s globstarkaynaklanmış bash'ınızda yapın veya yapın. Dosyalar.
Monica'yı eski

1
Ayrıca llgenellikle benzer bir şeyle takma addır ls -l, ancak gerçekten bir komut veya taşınabilir değildir. Yani, ardışık tüm listelemek için .pycdosyaları .yerine böyle bir şey yapması gerektiğini, echo **/*.pycglobstar ile etkin
eski durumuna Monica Lütfen

3

İlk çalıştırma:

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

Sonra Ekle:

export PYTHONDONTWRITEBYTECODE=1

~ / .Profile


3

artık .pyc istemiyorsanız bu tek satırı bir terminalde kullanabilirsiniz:

export PYTHONDONTWRITEBYTECODE=1

Eğer fikrini değiştirirsen:

unset PYTHONDONTWRITEBYTECODE

2

rm -ryalnızca dizinleri verdiğiniz dizinleri içerir rm. Ayrıca bu dizinleri de silecektir. Bir çözüm:

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

findtüm * .pyc dosyalarını geçerli dizinde özyinelemeli olarak bulur ve fordöngü, bulunan dosyaların listesini yineleyerek her birini kaldırır.


Bu bir .sh dosyasına koymak ve (ki benim için iyi, bu komutu bir kereden fazla
kullanacağım

Hepsini ';' ile ayrılmış tek bir satıra koymanın, kabukta çalıştırmanıza izin vermesi gerektiğine inanıyorum. Ama bunu bash yazdığımda, bash sonunda bir şey yürütmek için "bitmiş" bekler ...
Chris Lutz

Bu korkunç bir antipattern (ve çok yaygın bir tanesidir, keşke ortadan kalkabilseydi): boşluklar veya glob karakterleri içeren dosya adları ile kırılır. Ve noktası kaçırır findonun ile -execyüklemi: find . -name '*.pyc' -exec rm {} +(hoş, daha kısa, daha güvenli ve sağlam, daha etkili).
gniourf_gniourf


1

Koşabilirsin find . -name "*.pyc" -type f -delete .

Ancak önlemle kullanın. find . -name "*.pyc" -type fTam olarak hangi dosyaları kaldıracağınızı görmek için önce çalıştırın .

Ayrıca, -delete komutunun son bağımsız değişkeni olduğundan emin olun. -Name * .pyc bağımsız değişkeninden önce koyarsanız, her şeyi siler.


1

Tüm .pyc dosyalarını proje klasöründen silmek istiyorsanız.

İlk olarak,

cd <path/to/the/folder>

sonra tüm .pyc dosyasını bulun ve silin.

find . -name \*.pyc -delete
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.