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?
rm
akan dipanggil dengan argumen [-r, a.pyc, b.pyc].**/*.pyc
maka Anda tidak perlu khawatir lagiJawaban:
sumber
find . -name \*.pyc -delete
{}
. Apa yang akan terjadi jika secara tidak sengaja memisahkan kata dan menghapus jalur perantara yang kebetulan disebut seperti fragmen jalur yang Anda temukan?-delete
bukan bagian dari spesifikasi POSIX, dan tidak dijamin ada di semua implementasifind
.find . -name '*.pyc' -delete
Tentunya yang paling sederhana.
sumber
find
dukungan Anda-delete
; ini bukan bagian dari standar POSIX.__pycache__
direktori. Lihat jawaban saya.-name '*.py?'
untuk memasukkan.pyo, .pyc,...
Dalam versi debian saat ini Anda memiliki
pyclean
skrip yang ada dalampython-minimal
paket.Penggunaannya sederhana:
sumber
pyclean
(dan sekarangpy3clean
) berasal dari paket Debian, dan karenanya tidak ada di RHEL.Tambahkan ke Anda
~/.bashrc
:Ini menghapus semua file .pyc dan .pyo, dan
__pycache__
direktori. Ini juga sangat cepat.Penggunaannya sederhana:
sumber
find . -type d -name "__pycache__" -delete
akan sering memberi peringatan tentang path yang hilang karena ternyata konten akan ditambahkan ke antrian sebelum folder dihapus.2>/dev/null
harus memperbaikinya.Jika Anda menggunakan bash> = 4.0 (atau zsh)
Catatan yang
*/*.pyc
memilih semua.pyc
file di subdirektori tingkat pertama langsung sambil**/*.pyc
memindai seluruh pohon direktori secara rekursif. Sebagai contoh,foo/bar/qux.pyc
akan dihapus olehrm **/*.pyc
tetapi tidak oleh*/*.pyc
.Opsi-opsi shell globstar harus diaktifkan. Untuk mengaktifkan
globstar
:dan untuk memeriksa statusnya:
sumber
rm **/*.pyc
vsrm */*.pyc
? (Yang terakhir tampaknya bekerja untuk saya secara lokal.)rm */*.pyc
akan menghapus semua.pyc
file di semua subdirektori kedalaman 1.rm **/*.pyc
akan menghapus semua.pyc
file di semua subdirektori kedalaman 0+**
bertindak seperti*
saat dijalankan sebagai gantinya dan menjalankanshopt globstar
melempar kesalahan).Saya dulu menggunakan alias untuk itu:
sumber
find -print0
danxargs -0
sebagai gantinya.Untuk pengguna windows:
sumber
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:
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.
sumber
Ini lebih cepat dari
sumber
Lebih jauh, orang biasanya ingin menghapus semua
*.pyc
,*.pyo
file dan__pycache__
direktori secara rekursif di direktori saat ini.Perintah:
sumber
find
,grep
dan teman-teman tidak bekerja di sana.Hanya untuk melemparkan varian lain ke dalam campuran, Anda juga dapat menggunakan backquotes seperti ini:
sumber
rm
.Ekstensi Django
Implementasinya dapat dilihat dalam kode sumbernya .
sumber
penuh rekursif
sumber
**
adalah redundan, dan seperti dalamd0k
jawaban, Anda harus mengaktifkan globstar di bash 4+ agar ini berfungsi sebagaimana dimaksud. yaitu melakukanshopt -s globstar
atau memilikinya di salah satu bash bersumber Anda. file.ll
umumnya alias untuk sesuatu sepertils -l
, tetapi tidak benar-benar perintah atau portabel. Jadi, untuk mendaftarkan semua.pyc
file secara rekursif.
, Anda harus melakukan sesuatu sepertiecho **/*.pyc
dengan mengaktifkan globstarLari pertama:
Kemudian tambahkan:
Ke ~ /. Profil
sumber
jika Anda tidak ingin .pyc lagi Anda dapat menggunakan baris ini di terminal:
jika Anda berubah pikiran:
sumber
rm -r
berulang ke direktori, tetapi hanya direktori yang Anda berikanrm
. Ini juga akan menghapus direktori tersebut. Salah satu solusinya adalah:find
akan menemukan semua file * .pyc secara rekursif di direktori saat ini, danfor
loop akan beralih melalui daftar file yang ditemukan, menghapus masing-masing.sumber
find
dengan nya-exec
predikat:find . -name '*.pyc' -exec rm {} +
(lebih bagus, lebih pendek, lebih aman, kuat, lebih efisien).sumber
Anda bisa lari
find . -name "*.pyc" -type f -delete
.Tetapi gunakan dengan hati-hati. Jalankan dulu
find . -name "*.pyc" -type f
untuk 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.
sumber
Jika Anda ingin menghapus semua file .pyc dari folder proyek.
Pertama, kamu punya
kemudian temukan semua file .pyc dan hapus.
sumber