Como apagar todos os arquivos, excluindo aqueles em um diretório?

0

Eu quero excluir todos os arquivos .pyc e .pyo de forma recursiva, mas excluir um determinado diretório. Acabei de encontrar alguma limitação em que a localização não pode ser apagada ao ignorar. Eu tentei canalizar o resultado para xargs rm , mas isso também falha.

find . -not \( -path somedir -prune \) -name '*.py[co]' -exec rm '{}' \;

com erro:

find: The -delete action atomatically turns on -depth, but -prune does nothing when -depth is in effect.  If you want to carry on anyway, just explicitly use the -depth option.

Isso também falha:

find . -type f -not -path 'somdir/*' -name '*.py[co]' -print0 | xargs -0 rm

Versões:

  • SO: Ubuntu 14.04 LTS
  • encontre a versão 4.4.2
por tarabyte 25.04.2018 / 08:21

4 respostas

0

Parece que precisei colocar explicitamente o prefixo de . na frente do diretório. Não tenho certeza se entendi completamente o motivo, mas para qualquer outra pessoa nesta situação:

Falha:

find . -type f -not -path 'somdir/*' -name '*.py[co]' -print0 | xargs -0 rm

Trabalhos:

find . -type f -not -path './somdir/*' -name '*.py[co]' -print0 | xargs -0 rm
    
por 30.04.2018 / 18:57
0

Você parece confuso como -not e -prune interagem. O habitual é "encontrar isto e podá-lo, ou isto e podá-lo, ou isto e realmente fazer algo com ele".

find . -path somedir -prune -o -name '*.py[co]' -delete

Substitui -exec ... por -delete , que executa uma ação de exclusão integrada sem processos externos. Se você quiser -exec outra coisa em algum momento, talvez use -exec command {} + em vez de -exec command {} \; (e observe como as aspas simples em torno de {} não são realmente úteis; o shell irá processá-las e removê-las antes de find é executado de qualquer maneira).

    
por 25.04.2018 / 09:03
0

Se "somedir" não for muitos, você pode remover a permissão de gravação temporariamente e apenas -name '*.py[co]' -delete de todos eles.

Lembre-se de adicionar a permissão de gravação de volta a "somedir".

Br

    
por 27.04.2018 / 16:02
0

Faça a filtragem com awk e use xargs para executar o comando?

find . -type f -name '*.py[co]' -print0 \
    | awk -vRS='
find . -type f -name '*.py[co]' -print0 \
    | awk -vRS='%pre%' '!/^.\/somedir\//' \
    | xargs -0 rm
' '!/^.\/somedir\//' \ | xargs -0 rm

awk parâmetros:

  • -vRS='\n' define RS (Record Separator) como nul ( ! ) em vez do padrão ( ^./somedir/ )
  • ./somedir/ nega o regex
  • ^.\/somedir\/ qualquer registro que comece com %code%
    • não se esqueça de escapar das barras regex / path - o regex bruto se torna: %code%
por 27.04.2018 / 16:29

Tags