Executando vários comandos para vários arquivos em uma linha [duplicado]

0

Estou tentando executar vários comandos na mesma linha para vários arquivos. Tenho pouca experiência com o Linux e me deparei com um problema com este comando:

tail -n +3 "/usr/local/tmp/csce215/election2008/"*/*.csv | head -n -1 > polls.csv

Estou tentando obter a "seção intermediária" de cada arquivo usando a cauda e a cabeça em sucessão. Infelizmente, o tail é executado para cada arquivo corretamente, mas o head parece funcionar apenas para o último arquivo. Isso é possível em um comando ou existe um método melhor para fazer isso? Eu preferiria usar cabeça e cauda.

    
por reversebottle 18.01.2017 / 03:40

1 resposta

0

O problema é que tail está criando um único fluxo de dados para passar para head , e é o que está sendo usado lá.

Em vez disso, você precisa processar cada arquivo - tail to head - e usar esse resultado no arquivo polls.csv.

Um one-liner ficaria assim:

shopt -s nullglob; for name in "/usr/local/tmp/csce215/election2008/"*/*.csv; do echo "==> $name" >> polls.csv; tail -n +3 "$name" | head -n -1 >>polls.csv; echo "" >> polls.csv; done;

O nullglob shopt-s impede ações indesejadas se não houver arquivos * .csv para encontrar.

Naturalmente, como isso usa o acréscimo ao arquivo para o redirecionamento, você precisará excluir o arquivo de enquetes após cada uso ou ele continuará crescendo. Ou modifique os comandos para atacá-lo no começo:

echo "" > polls.csv; shopt -s nullglob; for name in "/usr/local/tmp/csce215/election2008/"*/*.csv; do echo "==> $name" >> polls.csv; tail -n +3 "$name" | head -n -1 >>polls.csv; echo "" >> polls.csv; done;

Com as limitações do ecrã, não é apresentado como uma linha, mas sim como uma linha. Copiar / Colar deve mantê-lo como uma linha para você.

    
por 18.01.2017 / 04:17