Se você escreve um script para ser executado em vários sistemas e a portabilidade é uma preocupação, então nada supera for loops e ${var%sfx} da resposta de user1404316 .
No entanto, se você está procurando uma maneira conveniente de fazer coisas semelhantes em seu próprio sistema, então eu recomendo vivamente Paralelo GNU , que é basicamente xargs em esteróides. Aqui está uma solução para sua tarefa específica:
parallel mycommand {} -o {.}-processed.txt ::: *.txt
Será necessária uma lista de strings após ::: (o shell expandirá *.txt para uma lista de nomes de arquivos correspondentes) e executará mycommand {} -o {.}-processed.txt para cada string, substituindo {} por string de entrada (como xargs ) e {.} com nome de arquivo sem extensão.
Você pode alimentar listas de strings de entrada via stdin ( xargs -way), para parear com find ou locate , mas eu raramente preciso de algo mais que zsh ' globs estendidos.
Dê uma olhada no tutorial paralelo GNU para ter uma ideia do que ele pode fazer. Eu uso isso o tempo todo para converter lotes, extraindo arquivos para outros diretórios, etc.