(./myprogram 1.txt; ./myprogram 2.txt; ./myprogram 3.txt; ./myprogram 4.txt) > out.txt
Atualmente, utilizo várias linhas para anexar conteúdo a um arquivo combinado, por exemplo,
./myprogram 1.txt > Out.txt # Overwrite for the 1st file
./myprogram 2.txt >> Out.txt
./myprogram 3.txt >> Out.txt
./myprogram 4.txt >> Out.txt
É possível substituir por um liner?
(./myprogram 1.txt; ./myprogram 2.txt; ./myprogram 3.txt; ./myprogram 4.txt) > out.txt
Depende do que você deseja fazer e de como seu programa manipula os argumentos de entrada.
Mas digamos que você tenha /path/to/myprogram.sh
que se parece com este:
#!/bin/bash
echo "Processing file ${1?missing input file}"
Você pode fazer o seguinte
find /path/to/inputfiles -name "*.txt" -exec /path/to/myprogram.sh {} \; > Out.txt
Ou dentro do bash (ou qualquer shell parecido com o Bourne):
for i in *.txt; do /path/to/myprogram.sh "$i"; done > Out.txt
(eu uso for-loop ou find porque será muito mais conveniente se você tiver 1000 arquivos de entrada em vez dos 4 arquivos em seu exemplo)
Muito semelhante à resposta de Per, mas mantém o layout do original:
{
./myprogram 1.txt
./myprogram 2.txt
./myprogram 3.txt
./myprogram 4.txt
} > Out.txt
myprogram-wrapper.sh:
#!/bin/sh - while test $# -ge 1 do ./myprogram $1 shift done
invoque com ./myprogram-wrapper.sh 1.txt 2.txt 3.txt 4.txt > Out.txt
Para criar um wrapper reutilizável:
#!/bin/sh - prog=$1 shift while test $# -ge 1 do ${prog} $1 shift done
e invoque como wrapper ./mycommand 1.txt 2.txt 3.txt 4.txt > Out.txt
Isso, claro, é uma trapaça, já que o script em si não é um oneliner, mas achei que você poderia gostar mesmo assim.
Acho essa solução mais elegante:
FILE=/tmp/file.log
exec >> $FILE
./myprogram 1.txt
./myprogram 2.txt
./myprogram 3.txt
./myprogram 4.txt
exec 1<&2
echo 'Normal output has returned!'
Tags bash shell shell-script