Como remover arquivos que não terminam com “.c”?

5

Eu tenho um diretório que contém todos os programas em C. Eu também os compilei na hora da criação para checar meu código. Existem muitos programas, quase 100 deles. Então, eu quero um script BASH que verifique se o arquivo termina com ".c". Se isso acontecer, então não faz nada, o que, se não, então, os removeria. Suponha que um dos nomes do meu arquivo seja "Hello.c", então eu nomeei seu binário durante o tempo de compilação como "Hello". Então, alguém pode fazer esse script para mim?

    
por Pranit Bauva 04.04.2013 / 14:46

3 respostas

21

Você pode usar o sinal -delete de find (primeiro teste com -ls )

find -not -name "*.c" -delete

Se você não quiser usar find , mas apenas arquivos no diretório atual, você pode fazer

rm !(*.c)

Certifique-se, em bash , de que com shopt -s extglob a globbing correta está definida. Além disso, se você tiver globstar set ( shopt -s globstar ), você pode agir recursivamente (para bash versões acima de 4):

rm **/!(*.c)
    
por 04.04.2013 / 14:53
5

Eu sempre prefiro find nesses casos. Você não precisa se preocupar com nomes de arquivos especiais e pode lidar com diferentes tipos de arquivos. Se você quiser excluir apenas arquivos, adicione -type f às suas opções. Então minha solução favorita é:

find -not -name "*.c" -type f -delete

Mas tenha cuidado. Testar tais comandos é sempre uma boa ideia.

    
por 04.04.2013 / 17:36
4

Ative os padrões de curingas do ksh estendido com o comando shopt -s extglob (você pode colocar isso no seu ~/.bashrc ). Em seguida, o padrão !(*.c) corresponde a todos os arquivos no diretório atual, exceto os que correspondem a *.c :

rm !(*.c)

Isso é bastante perigoso, pois exclui .txt arquivos, .h arquivos, etc. Um comando menos drástico seria

rm !(*.*) *.o

Isso ainda exclui README , Makefile , etc. Você talvez só possa excluir arquivos executáveis:

find . -type d -prune -o -type f -perm -100 -exec rm {} +

Mais curto, se o seu find for compatível:

find . -maxdepth 1 -type f -perm -100 -delete
    
por 08.04.2013 / 04:09