Script de shell: lista de filtros de arquivos .pdf, para excluir aqueles com um arquivo de origem .tex

4

Eu tenho uma lista de caminhos de arquivos separados por linebreak, todos em arquivos PDF. Eu gostaria de filtrar todos aqueles que têm um arquivo *.tex correspondente no mesmo diretório (e, portanto, podem ser presumidos gerados automaticamente).

Por exemplo, se a lista incluir foo.tex , foo.pdf , bar.pdf , gostaria que o script emitisse apenas bar.pdf . Se eu tiver foo/foo.tex e bar/foo.pdf , gostaria que o script gerasse bar/foo.pdf .

(O caso de uso é descrito em esta pergunta : Eu tenho um repositório git contendo arquivos tex e PDFs produzidos externamente Os pdfs gerados automaticamente não devem ser rastreados pelo git, mas outros devem ser. A solução que tenho em mente é colocar *.pdf no .gitignore , mas adicione um git post-commit hook que me avisa quando há pdfs não rastreados além daqueles gerados a partir dos arquivos .tex . Estou obtendo a lista de pdfs não acompanhados com git status --ignored *.pdf , mas não tenho certeza de como para implementar de forma limpa este próximo passo.)

    
por PLL 19.03.2015 / 04:59

1 resposta

3

Você pode usar um loop normal com [ -e e ${xxx%.pdf} para verificar e construir os nomes dos arquivos. Isso lê os caminhos na entrada padrão, um por linha:

while read path
do
    [ -e "${path%.pdf}.tex" ] || echo "$path"
done

"${path%.pdf}" se expande para $path com ".pdf" retirado do final e, em seguida, podemos colocar o ".tex" no final diretamente. Se -e xists não fizermos nada, e caso contrário ( || ) imprimirá o caminho para o PDF. Você poderia colocar lógica e comportamento mais complicados lá se quisesse.

As advertências usuais sobre o valor de IFS e nomes de arquivos contendo novas linhas, etc, se aplicam, mas supondo que você não tenha nada de incomum acontecendo que funcione diretamente.

    
por 19.03.2015 / 05:29