Adiciona arquivos com o one-liner bash?

3

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?

    
por Ryan 07.08.2014 / 13:16

5 respostas

8

(./myprogram 1.txt; ./myprogram 2.txt; ./myprogram 3.txt; ./myprogram 4.txt) > out.txt
    
por 07.08.2014 / 14:37
5

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)

    
por 07.08.2014 / 14:28
1

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

link

    
por 08.08.2014 / 17:47
0

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.

    
por 08.08.2014 / 16:41
0

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!'
    
por 09.08.2014 / 13:17