Não funciona porque no UNIX, os globs são expandidos pelo shell, não pelo programa que está sendo executado. Se você tiver a.pyc e b.pyc no diretório atual e os diretórios foo e bar, rmserão chamados com argumentos [-r, a.pyc, b.pyc].
ephemient
1
Se você está se preocupando com empurrar o seu código para outras pessoas, você pode simplesmente adicioná-lo à .gitignore **/*.pycentão você não terá que se preocupar com isso novamente
O Find possui uma ação "-delete" embutida, para que você possa fazer exatamente #find . -name \*.pyc -delete
Christoffer
51
Mais importante, se essa é uma máquina de desenvolvimento, você pode definir PYTHONDONTWRITEBYTECODE = True e nunca precisará fazer isso novamente. Veja: esta resposta .
Mlissner
5
Você não está citando {}. O que aconteceria se acidentalmente dividisse a palavra e excluísse um caminho intermediário que é chamado como um fragmento do caminho que você encontrou?
Robottinosino
20
-deletenão faz parte da especificação POSIX e não existe garantia em todas as implementações de find.
Chepner
7
Se você está com medo - o que pode ser bom - faça um primeiro passe com -exec echo {} ou - se você está com muito medo - use rm -i {}, que pergunta a cada vez ou rm - v {}, para ver o que você exclui.
Vale ressaltar que o pyclean parece excluir apenas os arquivos .pyc para os quais há um arquivo .py correspondente (pelo menos no meu sistema - ubuntu 12.10.) Isso significa que não é muito útil em situações em que um arquivo de origem foi excluído e você deseja para limpar os arquivos .pyc restantes.
precisa saber é o seguinte
@holms pyclean(e agora py3clean) se originam em um pacote Debian e, portanto, não estão no RHEL.
duozmo
83
Adicione ao seu ~/.bashrc:
pyclean (){
find .-type f -name "*.py[co]"-delete
find .-type d -name "__pycache__"-delete
}
Isso remove todos os arquivos e __pycache__diretórios .pyc e .pyo . Também é muito rápido.
find . -type d -name "__pycache__" -deletegeralmente emitirá um aviso sobre um caminho ausente porque, aparentemente, o conteúdo será adicionado à fila antes da exclusão da pasta. 2>/dev/nulldeveria consertar isso.
Mad Físico
53
Se você estiver usando o bash> = 4.0 (ou zsh)
rm **/*.pyc
Observe que */*.pycseleciona todos os .pycarquivos nos subdiretórios imediatos de primeiro nível enquanto **/*.pycverifica recursivamente toda a árvore de diretórios. Como exemplo, foo/bar/qux.pycserá excluído por, rm **/*.pycmas não por */*.pyc.
As opções do shell globstar devem estar ativadas. Para habilitar globstar:
Qual é a diferença entre running rm **/*.pycvs rm */*.pyc? (Este último parecia estar a trabalhar para mim localmente.)
Taylor Edmiston
1
@TaylorEdmiston rm */*.pycirá apagar todos os .pycarquivos em todos os subdiretórios de profundidade 1. rm **/*.pycirá apagar todos os .pycarquivos em todos os subdiretórios de profundidade 0+
Adam Stewart
@AdamStewart Obrigado por adicionar isso. Para outros que tropeçam nessa discussão, o problema que eu estava enfrentando era que o bash da Apple enviado com o OS X não inclui a globstar ( **age como *quando executado em vez disso e a execução shopt globstargera um erro).
Taylor Edmiston
30
Eu costumava usar um alias para isso:
$ which pycclean
pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'
Isso não lida bem com espaços em branco nos nomes de arquivos. Você deve usar find -print0e em xargs -0vez disso.
R3m0t
2
Por que você deseja ter código python com espaços nos nomes de arquivos / pastas? Isso é sintaticamente legal?
Coredumperror
@CoreDumpError, sim, de fato no Windows Python é instalado em um diretório com espaços ("Arquivos de Programas").
Paul Draper
O interpretador python pode ser instalado lá por padrão, mas dificilmente é um bom lugar para colocar seu código . Além disso, você certamente não gostaria que a pasta Arquivos de Programa fizesse parte da sua estrutura de pacotes, e é por isso que fiquei desconfiado com a sintaxe.
Colocar isso em um script em lote torna as coisas super fáceis. Obrigado.
precisa
E se você estiver no Powershell, isso pode ser usado com "cmd" -> Executar comando -> "exit".
Np8 25/07/19
18
find .-name '*.pyc'-print0 | xargs -0 rm
A localização procura recursivamente os arquivos * .pyc. O xargs pega essa lista de nomes e a envia para rm. -Print0 e -0 dizem aos dois comandos para separar os nomes de arquivos com caracteres nulos. Isso permite que ele funcione corretamente em nomes de arquivos que contêm espaços e até mesmo um nome de arquivo que contém uma nova linha.
A solução com -exec funciona, mas gera uma nova cópia da rm para cada arquivo. Em um sistema lento ou com muitos arquivos, isso levará muito tempo.
Você também pode adicionar mais alguns argumentos:
iname adiciona insensibilidade a maiúsculas e minúsculas, como * .PYC. O no-run-if-empty impede que você obtenha um erro da rm se você não tiver esses arquivos.
Essa é uma boa resposta, mas uma solução simples para Python seria multiplataforma e, portanto, preferível. Embora, pessoalmente, eu não me importo sobre o Windows provavelmente metade das vidas da população Python no Windows - e find, grepe amigos não funcionam lá.
31419 Peterino
Eles fazem se você instalar as ferramentas. Eu recomendo que todos os usuários da CLI do Windows façam isso para facilitar a
compatibilidade
8
Apenas para lançar outra variante na mistura, você também pode usar aspas como esta:
Interessante, como isso se compara às respostas de Andy e Bill?
Austin Henley
3
Um conjunto de **é redundante e, como na d0kresposta, você deve habilitar o globstar no bash 4+ para que isso funcione conforme o esperado. ou seja, faça shopt -s globstarou tenha isso em uma de suas festas de origem. arquivos.
Reinstate Monica Por favor,
1
Também llé comumente alias a algo como ls -l, mas não é realmente um comando ou portátil. Portanto, para listar recursivamente todos os .pycarquivos ., você deve fazer algo como echo **/*.pyccom o globstar ativado
Este funciona embora eu tenho que colocá-lo em um arquivo .sh e executar esse (que é bom por mim, eu vou estar usando este comando mais de uma vez)
Teifion
Acredito que colocar tudo em uma linha separada por ';' deve permitir que você execute no shell. Mas quando eu digito que na festança, aguarda o "feito" no final para executar qualquer coisa ...
Chris Lutz
É um péssimo antipadrão (e também muito comum, eu gostaria que ele desaparecesse): ele quebra com nomes de arquivos contendo espaços ou caracteres glob. E ele perde o sentido de findseu -execpredicado: find . -name '*.pyc' -exec rm {} +(melhor, mais curto, mais seguro, robusto, mais eficiente).
rm
serão chamados com argumentos [-r, a.pyc, b.pyc].**/*.pyc
então você não terá que se preocupar com isso novamenteRespostas:
fonte
find . -name \*.pyc -delete
{}
. O que aconteceria se acidentalmente dividisse a palavra e excluísse um caminho intermediário que é chamado como um fragmento do caminho que você encontrou?-delete
não faz parte da especificação POSIX e não existe garantia em todas as implementações defind
.find . -name '*.pyc' -delete
Certamente o mais simples.
fonte
find
suporta-delete
; não faz parte do padrão POSIX.__pycache__
diretórios .pyo . Veja minha resposta.-name '*.py?'
para incluir.pyo, .pyc,...
Na versão atual do debian você tem um
pyclean
script que está nopython-minimal
pacote.O uso é simples:
fonte
pyclean
(e agorapy3clean
) se originam em um pacote Debian e, portanto, não estão no RHEL.Adicione ao seu
~/.bashrc
:Isso remove todos os arquivos e
__pycache__
diretórios .pyc e .pyo . Também é muito rápido.O uso é simplesmente:
fonte
find . -type d -name "__pycache__" -delete
geralmente emitirá um aviso sobre um caminho ausente porque, aparentemente, o conteúdo será adicionado à fila antes da exclusão da pasta.2>/dev/null
deveria consertar isso.Se você estiver usando o bash> = 4.0 (ou zsh)
Observe que
*/*.pyc
seleciona todos os.pyc
arquivos nos subdiretórios imediatos de primeiro nível enquanto**/*.pyc
verifica recursivamente toda a árvore de diretórios. Como exemplo,foo/bar/qux.pyc
será excluído por,rm **/*.pyc
mas não por*/*.pyc
.As opções do shell globstar devem estar ativadas. Para habilitar
globstar
:e para verificar seu status:
fonte
rm **/*.pyc
vsrm */*.pyc
? (Este último parecia estar a trabalhar para mim localmente.)rm */*.pyc
irá apagar todos os.pyc
arquivos em todos os subdiretórios de profundidade 1.rm **/*.pyc
irá apagar todos os.pyc
arquivos em todos os subdiretórios de profundidade 0+**
age como*
quando executado em vez disso e a execuçãoshopt globstar
gera um erro).Eu costumava usar um alias para isso:
fonte
find -print0
e emxargs -0
vez disso.Para usuários do Windows:
fonte
A localização procura recursivamente os arquivos * .pyc. O xargs pega essa lista de nomes e a envia para rm. -Print0 e -0 dizem aos dois comandos para separar os nomes de arquivos com caracteres nulos. Isso permite que ele funcione corretamente em nomes de arquivos que contêm espaços e até mesmo um nome de arquivo que contém uma nova linha.
A solução com -exec funciona, mas gera uma nova cópia da rm para cada arquivo. Em um sistema lento ou com muitos arquivos, isso levará muito tempo.
Você também pode adicionar mais alguns argumentos:
iname adiciona insensibilidade a maiúsculas e minúsculas, como * .PYC. O no-run-if-empty impede que você obtenha um erro da rm se você não tiver esses arquivos.
fonte
Isso é mais rápido que
fonte
Além disso, as pessoas geralmente deseja remover todas
*.pyc
,*.pyo
arquivos e__pycache__
diretórios de forma recursiva no diretório atual.Comando:
fonte
find
,grep
e amigos não funcionam lá.Apenas para lançar outra variante na mistura, você também pode usar aspas como esta:
fonte
rm
.Extensão Django
A implementação pode ser visualizada em seu código fonte .
fonte
recursivo completo
fonte
**
é redundante e, como nad0k
resposta, você deve habilitar o globstar no bash 4+ para que isso funcione conforme o esperado. ou seja, façashopt -s globstar
ou tenha isso em uma de suas festas de origem. arquivos.ll
é comumente alias a algo comols -l
, mas não é realmente um comando ou portátil. Portanto, para listar recursivamente todos os.pyc
arquivos.
, você deve fazer algo comoecho **/*.pyc
com o globstar ativadoPrimeira corrida:
Adicione então:
Para ~ / .profile
fonte
se você não quiser mais o .pyc, poderá usar esta única linha em um terminal:
Se você mudar de ideia:
fonte
rm -r
se repete em diretórios, mas apenas os diretórios aos quais você fornecerm
. Ele também excluirá esses diretórios. Uma solução é:find
encontrará todos os arquivos * .pyc recursivamente no diretório atual, e ofor
loop percorrerá a lista de arquivos encontrados, removendo cada um.fonte
find
seu-exec
predicado:find . -name '*.pyc' -exec rm {} +
(melhor, mais curto, mais seguro, robusto, mais eficiente).fonte
Você pode correr
find . -name "*.pyc" -type f -delete
.Mas use-o com precaução. Executar primeiro
find . -name "*.pyc" -type f
para ver exatamente quais arquivos você removerá.Além disso, verifique se -delete é o último argumento em seu comando. Se você o colocar antes do argumento -name * .pyc, ele excluirá tudo.
fonte
Se você deseja excluir todos os arquivos .pyc da pasta do projeto.
Primeiro você tem
encontre todo o arquivo .pyc e exclua.
fonte