Faça um loop sobre os arquivos em dir1 , obtenha o nome de cada arquivo, processe-o, escreva para o arquivo de saída:
for path in dir1/*; do
name="${path##*/}"
task1 "$path" | task2 | task3 --output "dir2/$name"
done
A substituição de variável ${path##*/} assumirá o valor da variável path e removerá tudo até (e incluindo) o último / . Isso produz o nome de base do arquivo.
task1 é então executado no arquivo em dir1 , o resultado é passado para task2 e a saída disso é dada para task3 . A última tarefa usa dir/$name como operando para sua opção --output .