Nie działa, ponieważ w UNIX globusy są rozszerzane przez powłokę, a nie przez uruchamiany program. Jeśli masz a.pyc i b.pyc w bieżącym katalogu, a katalogi foo i bar rmbędą wywoływane z argumentami [-r, a.pyc, b.pyc].
efhemient
1
jeśli martwisz się o przekazanie kodu innym osobom, możesz po prostu dodać go do .gitignore, **/*.pyca potem nie będziesz musiał się tym martwić
Find ma wbudowaną akcję „-delete”, więc możesz to zrobićfind . -name \*.pyc -delete
Christoffer
51
Co najważniejsze, jeśli jest to maszyna deweloperska, możesz ustawić PYTHONDONTWRITEBYTECODE = True i nigdy nie będziesz musiał tego robić ponownie. Zobacz: ta odpowiedź .
mlissner
5
Nie cytujesz {}. Co by się stało, gdyby przypadkowo podzielił słowo i usunął ścieżkę pośrednią, która nazywa się jak fragment znalezionej ścieżki?
Robottinosino,
20
-deletenie jest częścią specyfikacji POSIX i nie ma gwarancji istnienia we wszystkich implementacjach find.
chepner
7
Jeśli się boisz - co może być dobre - wykonaj pierwsze przejście z -exec echo {} lub - jeśli jesteś bardzo przestraszony - użyj rm -i {}, które pytają za każdym razem lub rm - v {}, aby zobaczyć, co usuwasz.
Warto zauważyć, że pyclean wydaje się usuwać tylko pliki .pyc, dla których istnieje odpowiedni plik .py (przynajmniej w moim systemie - ubuntu 12.10.) Oznacza to, że nie jest to bardzo pomocne w sytuacjach, gdy plik źródłowy został usunięty i chcesz aby usunąć resztki plików .pyc.
tigerFinch
@holms pyclean(i teraz py3clean) pochodzą z pakietu Debian, a zatem nie są w RHEL.
duozmo
83
Dodaj do ~/.bashrc:
pyclean (){
find .-type f -name "*.py[co]"-delete
find .-type d -name "__pycache__"-delete
}
Spowoduje to usunięcie wszystkich plików .pyc i .pyo oraz __pycache__katalogów. Jest również bardzo szybki.
find . -type d -name "__pycache__" -deleteczęsto ostrzega o brakującej ścieżce, ponieważ widocznie zawartość zostanie dodana do kolejki przed usunięciem folderu. 2>/dev/nullpowinien to naprawić.
Szalony fizyk
53
Jeśli używasz bash> = 4.0 (lub zsh)
rm **/*.pyc
Zauważ, że */*.pyczaznacza wszystkie .pycpliki w bezpośrednich podkatalogach pierwszego poziomu, podczas gdy **/*.pycrekurencyjnie skanuje całe drzewo katalogów. Na przykład foo/bar/qux.pyczostanie usunięty przez, rm **/*.pycale nie przez */*.pyc.
Opcje powłoki globstar muszą być włączone. Aby włączyć globstar:
Jaka jest różnica w bieganiu rm **/*.pycvs rm */*.pyc? (Wydaje się, że ten ostatni działa dla mnie lokalnie.)
Taylor Edmiston
1
@TaylorEdmiston rm */*.pycusunie wszystkie .pycpliki we wszystkich podkatalogach głębokości 1. rm **/*.pycusunie wszystkie .pycpliki we wszystkich podkatalogach głębokości 0+
Adam Stewart
@AdamStewart Dziękujemy za dodanie tego. Dla innych, którzy natknęli się na ten wątek, miałem problem polegający na tym, że bash Apple'a dostarczany z OS X nie zawiera globstar ( **działa więc tak , jak *gdy zamiast tego uruchamia się, a uruchamianie shopt globstargeneruje błąd).
Taylor Edmiston
30
Użyłem do tego aliasu:
$ which pycclean
pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'
Nie radzi sobie to dobrze z białymi spacjami w nazwach plików. Powinieneś użyć find -print0i xargs -0zamiast.
r3m0t
2
Dlaczego chcesz mieć kod Pythona ze spacjami w nazwach plików / folderów? Czy to jest syntaktycznie legalne?
coredumperror
@CoreDumpError, tak, w rzeczywistości w Windows Python instaluje się w katalogu ze spacjami („Program Files”).
Paul Draper,
Interpreter Pythona może instalować się tam domyślnie, ale nie jest to dobre miejsce na umieszczenie kodu . Ponadto z pewnością nie chcesz, aby folder Program Files był częścią struktury pakietu, dlatego ostrożnie podchodziłem do składni.
Umieszczenie tego w skrypcie wsadowym sprawia, że wszystko jest super łatwe. Dzięki.
Nick Gotch
A jeśli korzystasz z Powershell, można tego użyć z „cmd” -> Uruchom polecenie -> „exit”.
np8
18
find .-name '*.pyc'-print0 | xargs -0 rm
Znalezienie rekurencyjnie szuka plików * .pyc. Xargs pobiera tę listę nazw i wysyła ją do rm. -Print0 i -0 nakazują dwóm poleceniom rozdzielenie nazw plików znakami null. Pozwala to na poprawną pracę na nazwach plików zawierających spacje, a nawet na nazwach plików zawierających nowy wiersz.
Rozwiązanie z -exec działa, ale obraca nową kopię rm dla każdego pliku. W wolnym systemie lub z dużą liczbą plików, to zajmie zbyt długo.
Możesz również dodać kilka dodatkowych argumentów:
iname dodaje rozróżnianie wielkości liter, takie jak * .PYC. Polecenie no-run-if-empty zapobiega wyświetlaniu błędu z rm, jeśli nie masz takich plików.
To dobra odpowiedź, ale proste rozwiązanie w języku Python byłoby wieloplatformowe i dlatego jest preferowane. Choć osobiście nie dbam o windows prawdopodobnie połowa populacji żyje w Pythonie na Windows - a find, grepa przyjaciele nie tam pracują.
Peterino
Robią to, jeśli zainstalujesz oprzyrządowanie. Polecam każdemu użytkownikowi interfejsu CLI systemu Windows, aby zrobił to w celu ułatwienia wzajemnej zgodności: superuser.com/questions/168202/…
DylanYoung
8
Aby wrzucić inny wariant do miksu, możesz również użyć cudzysłowów w następujący sposób:
Ciekawe, jak to porównać do odpowiedzi Andy'ego i Billa?
Austin Henley,
3
Jeden zestaw **jest redundantny i zgodnie z d0kodpowiedzią, musisz mieć włączoną globstar w bash 4+, aby działało to zgodnie z przeznaczeniem. tzn. zrób shopt -s globstarlub miej to w jednym z twoich bashów. akta.
Przywróć Monikę, proszę,
1
llJest również powszechnie aliasowany do czegoś podobnego ls -l, ale tak naprawdę nie jest poleceniem ani urządzeniem przenośnym. Aby rekurencyjnie wyświetlić wszystkie .pycpliki ., powinieneś zamiast tego zrobić coś echo **/*.pycz włączoną globstar
Ten działa, chociaż muszę go umieścić w pliku .sh i uruchomić to (co jest w porządku,
użyję
Uważam, że umieszczenie tego wszystkiego w jednym wierszu oddzielonym znakiem „;” powinno pozwolić na uruchomienie go w powłoce. Ale kiedy wpisuję to w bash, bash czeka na „zrobione” na końcu, aby cokolwiek wykonać ...
Chris Lutz
To okropny antypattern (i bardzo powszechny, chciałbym, żeby mógł zniknąć): łamie się w nazwach plików zawierających spacje lub znaki globu. I nie ma sensu findze swoim -execorzeczeniem: find . -name '*.pyc' -exec rm {} +(ładniejszy, krótszy, bezpieczniejszy, solidny, wydajniejszy).
rm
będą wywoływane z argumentami [-r, a.pyc, b.pyc].**/*.pyc
a potem nie będziesz musiał się tym martwićOdpowiedzi:
źródło
find . -name \*.pyc -delete
{}
. Co by się stało, gdyby przypadkowo podzielił słowo i usunął ścieżkę pośrednią, która nazywa się jak fragment znalezionej ścieżki?-delete
nie jest częścią specyfikacji POSIX i nie ma gwarancji istnienia we wszystkich implementacjachfind
.find . -name '*.pyc' -delete
Z pewnością najprostszy.
źródło
find
obsługuje-delete
; nie jest częścią standardu POSIX.__pycache__
katalogi .pyo . Zobacz moją odpowiedź.-name '*.py?'
dołączyć.pyo, .pyc,...
W aktualnej wersji debiana masz
pyclean
skrypt, który jest wpython-minimal
pakiecie.Użycie jest proste:
źródło
pyclean
(i terazpy3clean
) pochodzą z pakietu Debian, a zatem nie są w RHEL.Dodaj do
~/.bashrc
:Spowoduje to usunięcie wszystkich plików .pyc i .pyo oraz
__pycache__
katalogów. Jest również bardzo szybki.Użycie jest po prostu:
źródło
find . -type d -name "__pycache__" -delete
często ostrzega o brakującej ścieżce, ponieważ widocznie zawartość zostanie dodana do kolejki przed usunięciem folderu.2>/dev/null
powinien to naprawić.Jeśli używasz bash> = 4.0 (lub zsh)
Zauważ, że
*/*.pyc
zaznacza wszystkie.pyc
pliki w bezpośrednich podkatalogach pierwszego poziomu, podczas gdy**/*.pyc
rekurencyjnie skanuje całe drzewo katalogów. Na przykładfoo/bar/qux.pyc
zostanie usunięty przez,rm **/*.pyc
ale nie przez*/*.pyc
.Opcje powłoki globstar muszą być włączone. Aby włączyć
globstar
:i aby sprawdzić jego status:
źródło
rm **/*.pyc
vsrm */*.pyc
? (Wydaje się, że ten ostatni działa dla mnie lokalnie.)rm */*.pyc
usunie wszystkie.pyc
pliki we wszystkich podkatalogach głębokości 1.rm **/*.pyc
usunie wszystkie.pyc
pliki we wszystkich podkatalogach głębokości 0+**
działa więc tak , jak*
gdy zamiast tego uruchamia się, a uruchamianieshopt globstar
generuje błąd).Użyłem do tego aliasu:
źródło
find -print0
ixargs -0
zamiast.Dla użytkowników systemu Windows:
źródło
Znalezienie rekurencyjnie szuka plików * .pyc. Xargs pobiera tę listę nazw i wysyła ją do rm. -Print0 i -0 nakazują dwóm poleceniom rozdzielenie nazw plików znakami null. Pozwala to na poprawną pracę na nazwach plików zawierających spacje, a nawet na nazwach plików zawierających nowy wiersz.
Rozwiązanie z -exec działa, ale obraca nową kopię rm dla każdego pliku. W wolnym systemie lub z dużą liczbą plików, to zajmie zbyt długo.
Możesz również dodać kilka dodatkowych argumentów:
iname dodaje rozróżnianie wielkości liter, takie jak * .PYC. Polecenie no-run-if-empty zapobiega wyświetlaniu błędu z rm, jeśli nie masz takich plików.
źródło
To jest szybsze niż
źródło
Ponadto, ludzie zwykle chcą, aby usunąć wszystkie
*.pyc
,*.pyo
pliki i__pycache__
katalogi rekursywnie w bieżącym katalogu.Komenda:
źródło
find
,grep
a przyjaciele nie tam pracują.Aby wrzucić inny wariant do miksu, możesz również użyć cudzysłowów w następujący sposób:
źródło
rm
.Rozszerzenie Django
Implementację można wyświetlić w kodzie źródłowym .
źródło
pełny rekurencyjny
źródło
**
jest redundantny i zgodnie zd0k
odpowiedzią, musisz mieć włączoną globstar w bash 4+, aby działało to zgodnie z przeznaczeniem. tzn. zróbshopt -s globstar
lub miej to w jednym z twoich bashów. akta.ll
Jest również powszechnie aliasowany do czegoś podobnegols -l
, ale tak naprawdę nie jest poleceniem ani urządzeniem przenośnym. Aby rekurencyjnie wyświetlić wszystkie.pyc
pliki.
, powinieneś zamiast tego zrobić cośecho **/*.pyc
z włączoną globstarPierwszy bieg:
Następnie dodaj:
Do ~ / .profile
źródło
jeśli nie chcesz już .pyc, możesz użyć tej pojedynczej linii w terminalu:
Jeśli zmienisz zdanie:
źródło
rm -r
powraca do katalogów, ale tylko do katalogów, które podajeszrm
. Spowoduje to również usunięcie tych katalogów. Jednym z rozwiązań jest:find
znajdzie rekursywnie wszystkie pliki * .pyc w bieżącym katalogu, afor
pętla przejdzie przez listę znalezionych plików, usuwając każdy z nich.źródło
find
ze swoim-exec
orzeczeniem:find . -name '*.pyc' -exec rm {} +
(ładniejszy, krótszy, bezpieczniejszy, solidny, wydajniejszy).źródło
Możesz biegać
find . -name "*.pyc" -type f -delete
.Ale używaj go ostrożnie. Uruchom najpierw,
find . -name "*.pyc" -type f
aby zobaczyć dokładnie, które pliki chcesz usunąć.Ponadto upewnij się, że -delete jest ostatnim argumentem w twoim poleceniu. Jeśli umieścisz go przed argumentem -name * .pyc, usunie wszystko.
źródło
Jeśli chcesz usunąć wszystkie pliki .pyc z folderu projektu.
Po pierwsze masz
następnie znajdź cały plik .pyc i usuń.
źródło