Я сомневаюсь, что это будет иметь большое значение.
Я бы использовал цикл только потому, что я не знаю, сколько файлов указано в списке файлов, и я не знаю (обычно), есть ли в именах файлов пробелы. Выполнение подстановки команды, которая генерирует очень длинный список аргументов, может привести к ошибке «Список аргументов слишком длинный», когда длина генерируемого списка слишком велика.
Моя петля будет выглядеть так
while IFS= read -r name; do
gunzip "$name"
done <file.list
Это дополнительно позволило бы мне вставить команды для обработки данных после gunzip
команды. Фактически, в зависимости от того, что на самом деле представляют собой данные и что нужно с ними делать, может быть даже возможно обработать их, не сохраняя их вообще в файл:
while IFS= read -r name; do
zcat "$name" | process_data
done <file.list
(где process_data
какой-то конвейер, который читает несжатые данные из стандартного ввода)
Если обработка данных занимает больше времени, чем распаковка, вопрос о том, является ли цикл более эффективным или нет, становится неактуальным.
В идеале , я бы предпочел не работать со списком имен файлов, а вместо этого использовать шаблон выделения имени файла, как в
for name in ./*.gz; do
# processing of "$name" here
done
где ./*.gz
образец, соответствующий соответствующим файлам. Таким образом, мы не зависим от количества файлов или символов, используемых в именах файлов (они могут содержать символы новой строки или другие пробельные символы, или начинаться с тире и т. Д.)
Связанные с:
gzip
в вашей системе, количества файлов в списке файлов и размера этих файлов.