Apagar todos os arquivos com extensão '.sh', mas manter um arquivo correspondente à extensão pelo terminal [duplicado]

3

Na verdade, esse tipo de pergunta é demais.

Mas eu quero remover todos os arquivos que combinam com a extensão ".sh" (somente pasta atual) que eu posso fazer com o comando abaixo:

find . -maxdepth 1 -type f -name '*.sh' -exec rm {} +

Mas ainda quero manter o arquivo "cron.sh" na pasta atual não afetado.

Como posso conseguir isso em uma única linha de comando?

    
por Vicky Dev 20.10.2016 / 14:09

2 respostas

5

Você pode usar -not :

find . -maxdepth 1 -type f -name '*.sh' -not -name cron.sh -delete

Além disso, o GNU find tem a opção -delete , que é mais simples de usar e que rm -rf .

Importante : coloque sempre -delete no final. Conforme explicado em man find :

  

Avisos: Não esqueça que a linha de comando de localização é avaliada                 como uma expressão, então colocar-apague primeiro fará com que a tentativa tente                 exclua tudo abaixo dos pontos iniciais que você especificou.

Como alternativa, você pode usar um loop de shell (mas não, o comando find acima é muito mais eficiente):

for f in *.sh; do [ "$f" = "cron.sh" ] || rm "$f"; done
    
por terdon 20.10.2016 / 14:14
1

Uma alternativa, mas mais lenta, então o ótimo exemplo de find por terdon é usar mv e rm comandos encadeados e operadores.

mv cron.sh cron.sh.safe && rm *.sh && mv cron.sh.safe cron.sh

Isso irá reclamar se você tiver algum diretório chamado something.sh, mas não irá apagá-lo.

    
por Arronical 20.10.2016 / 14:24