Bagaimana cara menghapus semua file .pyc dari suatu proyek?


678

Saya telah mengganti nama beberapa file dalam proyek yang cukup besar dan ingin menghapus file .pyc yang mereka tinggalkan. Saya mencoba skrip bash:

 rm -r *.pyc

Tapi itu tidak berulang melalui folder seperti yang saya pikir akan terjadi. Apa yang saya lakukan salah?


11
Ini tidak berfungsi karena di UNIX, gumpalan diperluas oleh shell, bukan oleh program yang sedang dijalankan. Jika Anda memiliki a.pyc dan b.pyc di direktori saat ini, dan direktori foo and bar, rmakan dipanggil dengan argumen [-r, a.pyc, b.pyc].
ephemient

1
jika Anda khawatir tentang mendorong kode Anda ke orang lain, Anda bisa menambahkannya ke .gitignore **/*.pycmaka Anda tidak perlu khawatir lagi
bubakazouba

Jawaban:


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

385
Find memiliki tindakan "-delete" bawaan, sehingga Anda bisa melakukannya sajafind . -name \*.pyc -delete
Christoffer

51
Yang paling penting, jika ini adalah mesin dev, Anda dapat mengatur PYTHONDONTWRITEBYTECODE = Benar, dan Anda tidak perlu melakukan ini lagi. Lihat: jawaban ini .
mlissner

5
Anda tidak mengutip {}. Apa yang akan terjadi jika secara tidak sengaja memisahkan kata dan menghapus jalur perantara yang kebetulan disebut seperti fragmen jalur yang Anda temukan?
Robottinosino

20
-deletebukan bagian dari spesifikasi POSIX, dan tidak dijamin ada di semua implementasi find.
chepner

7
Jika Anda takut - yang mungkin bagus - lewati dulu dengan -exec echo {}, atau - jika Anda sangat takut - gunakan rm -i {} yang bertanya setiap kali atau rm - v {} sehingga Anda dapat melihat apa Anda menghapus.
jeanM

1021

find . -name '*.pyc' -delete

Tentunya yang paling sederhana.


21
Jika versi finddukungan Anda -delete; ini bukan bagian dari standar POSIX.
chepner

4
Ini mengabaikan file .pyo dan __pycache__direktori. Lihat jawaban saya.
Wilfred Hughes

Saya menggunakan kode dari jawaban yang diterima dan berhasil, tetapi perintah ini lebih pendek dan sederhana
Dap

3
-name '*.py?'untuk memasukkan.pyo, .pyc,...
cdosborn

2
PASTIKAN -hapus adalah hal terakhir dalam perintah. Saya tidak sengaja meletakkan -hapus tepat setelah ditemukan. Itu menghapus semuanya!
thinkanotherone

85

Dalam versi debian saat ini Anda memiliki pycleanskrip yang ada dalam python-minimalpaket.

Penggunaannya sederhana:

pyclean .

34
Perlu dicatat bahwa pyclean tampaknya hanya menghapus file .pyc di mana ada file .py yang sesuai (setidaknya pada sistem saya - ubuntu 12.10.) Ini berarti sangat tidak membantu dalam situasi di mana file sumber telah dihapus dan Anda ingin untuk membersihkan sisa file .pyc.
tigerFinch

@holms pyclean(dan sekarang py3clean) berasal dari paket Debian, dan karenanya tidak ada di RHEL.
duozmo

83

Tambahkan ke Anda ~/.bashrc:

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

Ini menghapus semua file .pyc dan .pyo, dan __pycache__direktori. Ini juga sangat cepat.

Penggunaannya sederhana:

$ cd /path/to/directory
$ pyclean

find . -type d -name "__pycache__" -deleteakan sering memberi peringatan tentang path yang hilang karena ternyata konten akan ditambahkan ke antrian sebelum folder dihapus. 2>/dev/nullharus memperbaikinya.
Fisikawan Gila

53

Jika Anda menggunakan bash> = 4.0 (atau zsh)

rm **/*.pyc

Catatan yang */*.pycmemilih semua .pycfile di subdirektori tingkat pertama langsung sambil **/*.pycmemindai seluruh pohon direktori secara rekursif. Sebagai contoh, foo/bar/qux.pycakan dihapus oleh rm **/*.pyctetapi tidak oleh */*.pyc.

Opsi-opsi shell globstar harus diaktifkan. Untuk mengaktifkan globstar:

shopt -s globstar

dan untuk memeriksa statusnya:

shopt globstar

1
Apa perbedaan dalam menjalankan rm **/*.pycvs rm */*.pyc? (Yang terakhir tampaknya bekerja untuk saya secara lokal.)
Taylor Edmiston

1
@TaylorEdmiston rm */*.pycakan menghapus semua .pycfile di semua subdirektori kedalaman 1. rm **/*.pycakan menghapus semua .pycfile di semua subdirektori kedalaman 0+
Adam Stewart

@AdamStewart Terima kasih telah menambahkan ini. Bagi orang lain yang tersandung pada utas ini, masalah yang saya alami adalah bahwa bash Apple yang dikirim dengan OS X tidak menyertakan globstar (jadi **bertindak seperti *saat dijalankan sebagai gantinya dan menjalankan shopt globstarmelempar kesalahan).
Taylor Edmiston

30

Saya dulu menggunakan alias untuk itu:

$ which pycclean

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

12
Dalam debian saat ini adalah pyclean.
jb.

7
Ini tidak menangani spasi putih dalam nama file dengan baik. Anda harus menggunakan find -print0dan xargs -0sebagai gantinya.
r3m0t

2
Mengapa Anda ingin memiliki kode python dengan spasi di nama file / folder? Apakah itu secara hukum sintaksis?
coredumperror

@CoreDumpError, ya, sebenarnya pada Windows Python menginstal ke direktori dengan spasi ("Program Files").
Paul Draper

Penerjemah python dapat menginstal di sana secara default, tetapi itu bukan tempat yang baik untuk meletakkan kode Anda . Plus, Anda tentu tidak ingin folder Program Files menjadi bagian dari struktur paket Anda, itulah sebabnya saya khawatir tentang sintaks.
coredumperror

24

Untuk pengguna windows:

del /S *.pyc

Menempatkan ini dalam skrip batch membuat semuanya menjadi sangat mudah. Terima kasih.
Nick Gotch

Dan jika Anda menggunakan Powershell, ini dapat digunakan dengan "cmd" -> Run command -> "exit".
np8

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

Temukan secara rekursif mencari file * .pyc. Xargs mengambil daftar nama itu dan mengirimkannya ke rm. -Print0 dan -0 memberi tahu dua perintah untuk memisahkan nama file dengan karakter nol. Ini memungkinkannya untuk bekerja dengan benar pada nama file yang mengandung spasi, dan bahkan nama file yang mengandung baris baru.

Solusi dengan -exec berfungsi, tetapi memutar salinan rm baru untuk setiap file. Pada sistem yang lambat atau dengan banyak file, itu akan memakan waktu terlalu lama.

Anda juga bisa menambahkan beberapa argumen lagi:

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

iname menambahkan ketidakpekaan huruf besar-kecil, seperti * .PYC. Tanpa-lari-jika-kosong membuat Anda tidak mendapatkan kesalahan dari rm jika Anda tidak memiliki file seperti itu.


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

Ini lebih cepat dari

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

11

Lebih jauh, orang biasanya ingin menghapus semua *.pyc, *.pyofile dan __pycache__direktori secara rekursif di direktori saat ini.

Perintah:

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

Ini adalah jawaban yang bagus, tetapi solusi Python sederhana adalah cross-platform dan karenanya lebih disukai. Sementara, secara pribadi, saya tidak peduli tentang Windows mungkin setengah dari populasi Python hidup di Windows - dan find, grepdan teman-teman tidak bekerja di sana.
Peterino

Mereka melakukannya jika Anda menginstal tooling. Saya akan merekomendasikan setiap pengguna windows CLI untuk mempermudah cross-compat: superuser.com/questions/168202/…
DylanYoung

8

Hanya untuk melemparkan varian lain ke dalam campuran, Anda juga dapat menggunakan backquotes seperti ini:

rm `find . -name *.pyc`

5
Ini memiliki sedikit kelemahan jika gagal jika ada terlalu banyak pertandingan, karena akan ada terlalu banyak argumen untuk dilewatkan rm.
chepner


7

penuh rekursif

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

Menarik, bagaimana hal ini dibandingkan dengan jawaban Andy dan Bill?
Austin Henley

3
Satu set **adalah redundan, dan seperti dalam d0kjawaban, Anda harus mengaktifkan globstar di bash 4+ agar ini berfungsi sebagaimana dimaksud. yaitu melakukan shopt -s globstaratau memilikinya di salah satu bash bersumber Anda. file.
Reinstate Monica Please

1
Juga llumumnya alias untuk sesuatu seperti ls -l, tetapi tidak benar-benar perintah atau portabel. Jadi, untuk mendaftarkan semua .pycfile secara rekursif ., Anda harus melakukan sesuatu seperti echo **/*.pycdengan mengaktifkan globstar
Reinstate Monica Please

3

Lari pertama:

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

Kemudian tambahkan:

export PYTHONDONTWRITEBYTECODE=1

Ke ~ /. Profil


3

jika Anda tidak ingin .pyc lagi Anda dapat menggunakan baris ini di terminal:

export PYTHONDONTWRITEBYTECODE=1

jika Anda berubah pikiran:

unset PYTHONDONTWRITEBYTECODE

2

rm -rberulang ke direktori, tetapi hanya direktori yang Anda berikan rm. Ini juga akan menghapus direktori tersebut. Salah satu solusinya adalah:

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

findakan menemukan semua file * .pyc secara rekursif di direktori saat ini, dan forloop akan beralih melalui daftar file yang ditemukan, menghapus masing-masing.


Ini salah satu karya meskipun saya harus memasukkannya ke dalam sebuah file .sh dan menjalankan bahwa (yang baik-baik saja oleh saya, saya akan menggunakan perintah ini lebih dari sekali)
Teifion

Saya percaya menempatkan semuanya pada satu baris yang dipisahkan dengan ';' s harus membiarkan Anda menjalankannya di shell. Tapi ketika saya ketik yang di bash, menunggu pesta untuk "selesai" pada akhir untuk mengeksekusi apa-apa ...
Chris Lutz

Itu antipattern yang mengerikan (dan yang sangat umum juga, saya berharap itu bisa hilang): itu rusak dengan nama file yang mengandung spasi atau karakter glob. Dan itu meleset titik finddengan nya -execpredikat: find . -name '*.pyc' -exec rm {} +(lebih bagus, lebih pendek, lebih aman, kuat, lebih efisien).
gniourf_gniourf


1

Anda bisa lari find . -name "*.pyc" -type f -delete.

Tetapi gunakan dengan hati-hati. Jalankan dulu find . -name "*.pyc" -type funtuk melihat file mana yang akan Anda hapus.

Selain itu, pastikan bahwa -delete adalah argumen terakhir dalam perintah Anda. Jika Anda meletakkannya sebelum argumen -name * .pyc, itu akan menghapus semuanya.


1

Jika Anda ingin menghapus semua file .pyc dari folder proyek.

Pertama, kamu punya

cd <path/to/the/folder>

kemudian temukan semua file .pyc dan hapus.

find . -name \*.pyc -delete
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.