Предполагая, что список файлов хранится в файле с именем 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" извлекает пустое имя файла из пути к файлу.