Em vez de usar o -o
, por que não criar um padrão curinga?
find . -name '*py[c~]' -delete
ou:
find . -name '*py[c~]' -exec rm -f {} +
Desejo limpar um diretório (e subdiretórios) de cada ocorrência dos arquivos .py
e .pyc
. Eu tentei o seguinte
find . -name '*pyc' -o -name '*py~' -exec rm -f {} \;
que omitiu todos os arquivos pyc
. Ao fazer
find . -name '*pyc' -o -name '*py~'
o comando encontra os arquivos pyc
, que não são excluídos, seja qual for. Alguma ideia?
Em vez de usar o -o
, por que não criar um padrão curinga?
find . -name '*py[c~]' -delete
ou:
find . -name '*py[c~]' -exec rm -f {} +
O operador -a
(implícito entre dois predicados) tem precedência sobre -o
, então você precisa de parênteses:
find . \( -name '*pyc' -o -name '*py~' \) -a -exec rm -f {} +
(Eu incluo o -a
acima apenas para fins de demonstração, não é necessário, pois é implícito). Substitui ;
por +
, pois provavelmente não há sentido em executar um rm
por arquivo, se isso puder ser evitado.
Se você tem o bash 4+, você nem precisa encontrar, já que globstar lhe dará globalização recursiva:
shopt -s globstar
for f in ./**/*.py{c,~}; do rm "$f"; done
Observe que shopt
precisa estar em sua própria linha, em vez de ser separado por ;
(e deve ser usado no topo de um script, diretamente abaixo da shebang, se possível).
Eu sei que a questão não é tão nova ... mas talvez fosse o suficiente para usar
rm -f 'find . -name '*.pyc' -o -name '*.py~' '
Tags find