Предполагая, что список файлов хранится в файле с именем filelist (ровно один путь к файлу на строку), и вы хотите сохранить сжатые файлы в zipdir, этот скрипт bash достигнет желаемых результатов:
#!/bin/bash
while IFS= read file; do
gzip -c "$file" > "zipdir/$(basename "$file").gz"
done < filelist
В bash/dash вы также можете преобразовать вышеприведенное в однострочное:
while IFS= read file; do gzip -c "$file" > "zipdir/$(basename "$file").gz"; done < filelist
В других оболочках (например, tcsh или zsh)
bash -c 'while IFS= read file; do gzip -c "$file" > "zipdir/$(basename "$file").gz"; done < filelist'
сделаю работу.
Если bash отсутствует, его можно заменить на dash.
Как это устроено
... < filelist
перенаправляет содержимое списка файлов в ...
while IFS= read file; do ... done
просматривает строки в filelist, сохраняет содержимое текущей обработанной строки в файле переменных и выполняет ...
IFS=
изменяет внутренний разделитель файлов. Это необходимо для правильной обработки нескольких, ведущих и конечных пробелов.
gzip -c "$file" > "zipdir/$(basename "$file").gz"
сжимает текущий обработанный файл и сохраняет выходные данные в файле с тем же именем и расширением .gz в каталоге zipdir.
Здесь basename "$file"
извлекает пустое имя файла из пути к файлу.