Duvido que isso importe muito.
Eu usaria um loop, apenas porque não sei quantos arquivos estão listados no arquivo de lista e (geralmente) não sei se algum dos nomes de arquivos tem espaços em seus nomes. Fazer uma substituição de comando que geraria uma lista muito longa de argumentos pode resultar em um erro "Lista de argumentos muito longa" quando o comprimento da lista gerada for muito longo.
Meu loop ficaria assim
while IFS= read -r name; do
gunzip "$name"
done <file.list
Isso também me permitiria inserir comandos para processar os dados após o gunzip
comando. De fato, dependendo do que os dados realmente são e do que precisa ser feito com eles, pode até ser possível processá-los sem salvá-los no arquivo:
while IFS= read -r name; do
zcat "$name" | process_data
done <file.list
(onde process_data
está um pipeline que lê os dados não compactados da entrada padrão)
Se o processamento dos dados demorar mais que a descompactação, a questão de saber se um loop é mais eficiente ou não se torna irrelevante.
Idealmente , eu preferiria não elaborar uma lista de nomes de arquivos e usar um padrão globbing de nome de arquivo, como em
for name in ./*.gz; do
# processing of "$name" here
done
onde ./*.gz
está algum padrão que corresponde aos arquivos relevantes. Dessa forma, não dependemos do número de arquivos nem dos caracteres usados nos nomes de arquivos (eles podem conter novas linhas ou outros caracteres de espaço em branco, ou começar com traços, etc.)
Relacionado:
gzip
o sistema, o número de arquivos na lista de arquivos e o tamanho desses arquivos.