Você normalmente faria isso com um makefile algo assim:
IN = $(wildcard inputs/*.txt)
OUT = $(subst inputs/,outputs/,$(IN))
outputs/%.txt: inputs/%.txt
cp $< $@
default: $(OUT)
Isso faz com que o destino padrão (o primeiro no arquivo) dependa de OUT , que é a expansão glob dos arquivos existentes em IN com a sequência de diretórios alterada de entradas para saídas.
Se você quiser alterar o sufixo, há muitas outras funções internas para manipular os destinos. Por exemplo, você pode adicionar uma operação intermediária:
IN2 = $(addsuffix .out,$(basename $(IN)))
A função basename removerá o% final.txt e o addsuffix adicionará% .out .