Ich bezweifle, dass es viel ausmachen würde.
Ich würde eine Schleife verwenden, nur weil ich nicht weiß, wie viele Dateien in der Listendatei aufgeführt sind, und ich (im Allgemeinen) nicht weiß, ob einer der Dateinamen Leerzeichen in seinen Namen hat. Eine Befehlsersetzung, die eine sehr lange Liste von Argumenten erzeugen würde, kann zu einem Fehler "Argumentliste zu lang" führen, wenn die Länge der generierten Liste zu lang ist.
Meine Schleife würde so aussehen
while IFS= read -r name; do
gunzip "$name"
done <file.list
Dies würde mir zusätzlich erlauben, Befehle zum Verarbeiten der Daten nach dem gunzip
Befehl einzufügen . Abhängig davon, was die Daten tatsächlich sind und was damit zu tun ist, kann es sogar möglich sein, sie zu verarbeiten, ohne sie in einer Datei zu speichern:
while IFS= read -r name; do
zcat "$name" | process_data
done <file.list
(Wo process_data
ist eine Pipeline, die die unkomprimierten Daten von der Standardeingabe liest?)
Wenn die Verarbeitung der Daten länger dauert als die Dekomprimierung, ist die Frage, ob eine Schleife effizienter ist oder nicht, irrelevant.
Im Idealfall würde ich es jedoch vorziehen, eine Liste von Dateinamen nicht zu bearbeiten und stattdessen ein Dateinamen-Globbing-Muster wie in zu verwenden
for name in ./*.gz; do
# processing of "$name" here
done
Wo ./*.gz
ist ein Muster, das mit den relevanten Dateien übereinstimmt. Auf diese Weise sind wir weder von der Anzahl der Dateien noch von den in den Dateinamen verwendeten Zeichen abhängig (sie können Zeilenumbrüche oder andere Leerzeichen enthalten oder mit Bindestrichen usw. beginnen).
Verbunden:
gzip
auf Ihrem System dauert, wie viele Dateien in der Dateiliste enthalten sind und wie groß diese Dateien sind.