Remove arquivos com extensões específicas por regexp

0

Eu tenho o Makefile para compilar o arquivo LaTeX * .tex (tex- > dvi- > ps- > pdf). Então eu tenho o comando clean para remover arquivos temporários desnecessários (dvi, ps ...) assim:

rm 'ls | grep "^${FILENAME}\.(aux|dvi|ps|log)"'

mas remove até mesmo o arquivo * .pdf, que preciso manter.Se eu ecoar o resultado do ls | grep , achei, ele pega todos os arquivos, whoose extension começa com a primeira letra da extensão no regexp, então

echo 'ls | grep "^${FILENAME}\.[aux|dvi|ps|log]"'

#echoes proj.aux proj.dvi proj.log proj.pdf proj.ps

Outros arquivos não são alterados (* .tex)

Como faço para selecionar apenas os arquivos com extensões de regexp (e não * .pdf)? Agradecemos antecipadamente.

    
por user1980807 14.03.2018 / 16:13

3 respostas

3

Na linha de comando , você deve estar usando um shell glob em vez de tentar regexar a saída de ls . Por exemplo, no bash você poderia usar uma expansão de chave

rm "$FILENAME".{aux,dvi,log,ps} 

ou (se a globalização estendida estiver ativada)

rm "$FILENAME".!(tex|pdf)

Dentro de um Makefile, você provavelmente deveria estar usando as funções de transformação de texto do comando make - no caso do GNU make, por exemplo, você poderia usar addprefix , por exemplo.

FILENAME = foo

.PHONY: clean
clean:
        @echo rm $(addprefix $(FILENAME),.aux .dvi .log .ps)

dando

$ make clean
rm foo.aux foo.dvi foo.log foo.ps

Veja GNU make: Funções para substituição e análise de string

    
por steeldriver 14.03.2018 / 18:47
1

Primeiro de tudo, não use ls, use find. Mas de qualquer forma aqui é o que você está procurando no grep manpage :

   Matcher Selection
   -E, --extended-regexp
          Interpret PATTERN as an extended regular  expression  (ERE,  see
          below).

use algo assim:

echo 'find . | grep -E "^${FILENAME}\.(aux|dvi|ps|log)"'
    
por Simon Sudler 14.03.2018 / 17:14
1

Esta expressão funcionou: ls | grep -E ".(aux|dvi|ps|log)" . Você não usou o sinalizador -E, que permite que o grep use expressões regulares estendidas (isto é, permite | ser interpretado como um operador ou). Nota: você também poderia ter feito ls | grep -E ".aux|dvi|ps|log" e obtido o resultado desejado.

    
por Saul Kapruac 14.03.2018 / 17:12