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 .