Se o comando que você mostra na sua pergunta funcionar basicamente (para um número codificado de arquivos), então
first=1
for f in file*.gz
do
if [ "$first" ]
then
gzcat "$f"
first=
else
gzcat "$f"| tail -n +2
fi
done > collection_single_file
deve funcionar para você.
Espero que a lógica seja bem clara.
Observe todos os arquivos (altere o caractere curinga conforme apropriado para seus nomes de arquivos).
Se for o primeiro da lista, gzcat
, para obter o arquivo inteiro
(incluindo o cabeçalho).
Caso contrário, use tail
para remover o cabeçalho.
Depois de você ter lidado com um arquivo, nenhum outro arquivo será o primeiro.
Isso invoca tail
N −1 vezes, em vez de apenas uma vez (como sua resposta).
Além disso, minha resposta deve ser a mesma que a sua resposta.