Dudo que importe mucho.
Usaría un bucle, solo porque no sé cuántos archivos están listados en el archivo de lista, y no sé (generalmente) si alguno de los nombres de archivo tiene espacios en sus nombres. Hacer una sustitución de comando que generaría una lista muy larga de argumentos puede dar como resultado un error "Lista de argumentos demasiado larga" cuando la longitud de la lista generada es demasiado larga.
Mi bucle se vería así
while IFS= read -r name; do
gunzip "$name"
done <file.list
Esto también me permitiría insertar comandos para procesar los datos después del gunzip
comando. De hecho, dependiendo de lo que realmente sean los datos y de lo que se necesita hacer con ellos, incluso puede ser posible procesarlos sin guardarlos en el archivo:
while IFS= read -r name; do
zcat "$name" | process_data
done <file.list
(donde process_data
hay alguna canalización que lee los datos sin comprimir de la entrada estándar)
Si el procesamiento de los datos lleva más tiempo que descomprimirlos, la cuestión de si un bucle es más eficiente o no se vuelve irrelevante.
Idealmente , preferiría no trabajar en una lista de nombres de archivo, y en su lugar usar un patrón global de nombre de archivo, como en
for name in ./*.gz; do
# processing of "$name" here
done
donde ./*.gz
hay algún patrón que coincida con los archivos relevantes. De esta manera, no dependemos del número de archivos ni de los caracteres utilizados en los nombres de archivo (pueden contener líneas nuevas u otros caracteres de espacio en blanco, o comenzar con guiones, etc.)
Relacionado:
gzip
en su sistema, el número de archivos en la lista de archivos y el tamaño de esos archivos.