Não, não é possível - pelo menos não sem reescrever os temas dos programas.
Atualmente, cada um dos seus programas espera exatamente um arquivo em seu stdin. Algumas ou outras partes de sua inicialização estão configurando o estado referente ao processamento desse arquivo único. Eles executam essa inicialização e, em seguida, continuam lendo de stdin até atingirem "end of file" e, em seguida, sair.
Existem dois problemas aqui. A primeira é que um pipe não possui nenhum outro limite além do "fim do arquivo" (quando o gravador fecha o seu final). Você teria que criar algum tipo de sincronização especial para determinar quando um arquivo termina e outro arquivo é iniciado. (Talvez pacotes consistindo de comprimento + dados, com pacotes vazios marcando o final de um arquivo.) Você também precisaria de uma versão customizada de cat
que suporte isso.
O segundo problema é que alguns dos programas, eles mesmos, não esperam mais de um arquivo em seu stdin. Cada um deles teria que ser reescrito para 1) entender o esquema de sincronização para separar corretamente vários arquivos em stdin; 2) mover o processamento para um loop, para cada arquivo lido; 3) reinicialize alguma parte de sua memória antes de processar cada arquivo (isso depende muito do que exatamente cada programa faz).
Nota: Você diz que "o último programa ./program não tem essa opção para processar um diretório". Eu suponho que os outros programas do tenham essa opção. Isso significa que, para esses programas, # 2 e # 3 já estão implementados e podem ser ligados apenas ao código stdin de vários arquivos (etapa 1, que você ainda precisa implementar em todos os programas).