Use make !
Escreva um arquivo chamado GNUmakefile
com o conteúdo abaixo, mas onde eu coloquei o caractere ↦, coloque uma aba no lugar (tem que ser uma aba, não pode ser espaços).
all: $(filter-out %_output.fasta,$(wildcard *.fasta))
%_output.fasta: %.fasta
↦./script.sh $< >[email protected]
↦mv [email protected] $@
Agora, para gerar todos os arquivos, digite make
. Como bônus, se um arquivo de entrada não tiver sido alterado desde que o arquivo de saída foi gerado pela última vez, script.sh
não será executado novamente. Se você estiver modificando ativamente script.sh
e desejar gerar novamente os arquivos de saída, adicione script.sh
após %.fasta
, dessa forma os arquivos também serão regenerados se o script for alterado.
Explicações:
- A primeira linha especifica o que fazer quando você executa
make all
. Como é a primeira linha (o primeiro target , na terminologia do makefile), executar make
sem argumento faz a mesma coisa.
- A parte depois de
all:
gera a lista de nomes de .fasta
arquivos no diretório atual e remove os chamados _output.fasta
.
- A linha
%_output.fasta: %.fasta
inicia uma regra que explica como gerar um arquivo cujo nome termina com _output.fasta
(o destino ) do arquivo .fasta
correspondente (uma dependência ).
- As seguintes linhas recuadas por guias são os comandos a serem executados para gerar os arquivos.
- A primeira linha transforma a primeira dependência (
$<
) em um arquivo .tmp
.
- A segunda linha renomeia o arquivo
.tmp
para o arquivo de destino ( $@
). O motivo desse processo de duas etapas é que, se a geração for interrompida por algum motivo, isso não deixará um arquivo de destino inválido.
Nota: suponho que você esteja usando o Linux. Caso contrário, pode ser necessário instalar o GNU make e executá-lo em vez do comando make
padrão do seu sistema, se você quiser usar o código acima.
Se você usou uma extensão diferente para os arquivos de saída, isso tornaria as coisas um pouco mais fáceis.
all: $(patsubst %.fasta,%.out,$(wildcard *.fasta))
.SUFFIX: .out .fasta
.fast.out:
↦./script.sh $< >[email protected]
↦mv [email protected] $@
Se você substituir a primeira linha pela lista explícita de arquivos ( all: foo.out bar.out
), o arquivo poderá ser chamado de Makefile
e será executado com qualquer implementação de make
.