macOS & Linux
find
Implementasi BSD pada macOS berbeda dari GNU find - ini kompatibel dengan BSD dan GNU find. Mulailah dengan implementasi globbing, gunakan -name
dan -o
untuk atau - Letakkan fungsi ini di .bashrc
file Anda :
pyclean () {
find . -type f -name '*.py[co]' -delete -o -type d -name __pycache__ -delete
}
Kemudian cd
ke direktori yang ingin Anda bersihkan secara rekursif, dan ketik pyclean
.
GNU hanya menemukan
Ini adalah solusi GNU find, only (yaitu Linux), tapi saya merasa ini sedikit lebih baik dengan regex:
pyclean () {
find . -regex '^.*\(__pycache__\|\.py[co]\)$' -delete
}
Platform apa pun, menggunakan Python 3
Di Windows, Anda mungkin tidak memilikinya find
. Namun, Anda mungkin memiliki Python 3, yang dimulai pada 3.4 memiliki pathlib
modul yang mudah digunakan :
python3 -Bc "import pathlib; [p.unlink() for p in pathlib.Path('.').rglob('*.py[co]')]"
python3 -Bc "import pathlib; [p.rmdir() for p in pathlib.Path('.').rglob('__pycache__')]"
The -B
bendera memberitahu Python untuk tidak menulis .pyc
file. (Lihat juga PYTHONDONTWRITEBYTECODE
variabel lingkungan.)
Daftar pelanggaran di atas memahami perulangan, tetapi saat menggunakan python -c
, gaya agak menjadi perhatian sekunder. Sebagai alternatif, kami dapat menyalahgunakan (misalnya) __import__
:
python3 -Bc "for p in __import__('pathlib').Path('.').rglob('*.py[co]'): p.unlink()"
python3 -Bc "for p in __import__('pathlib').Path('.').rglob('__pycache__'): p.rmdir()"
Kritik atas jawaban
Jawaban teratas biasanya mengatakan:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Ini tampaknya kurang efisien karena menggunakan tiga proses. find
mengambil ekspresi reguler, jadi kami tidak perlu doa terpisah grep
. Demikian pula, sudah -delete
, jadi kita tidak perlu doa terpisah rm
- dan bertentangan dengan komentar di sini, itu akan menghapus direktori tidak kosong selama mereka dikosongkan berdasarkan pertandingan ekspresi reguler.
Dari xargs
halaman manual:
find /tmp -depth -name core -type f -delete
Temukan file dengan nama core di atau di bawah direktori / tmp dan hapus, tetapi lebih efisien daripada di contoh sebelumnya (karena kita menghindari kebutuhan untuk menggunakan fork (2) dan exec (2) untuk meluncurkan rm dan kita tidak memerlukan proses xargs ekstra).
*__pycache__
,*.pyc*
dan itu tidak membedakan antara file dan direktori. Sebagian besarrm
perintah yang dihasilkan juga akan berlebihan.