Assumindo que a lista de arquivos está armazenada em um arquivo chamado filelist (exatamente um caminho de arquivo por linha) e você deseja armazenar os arquivos compactados em zipdir , roteiro alcançará os resultados desejados:
#!/bin/bash
while IFS= read file; do
gzip -c "$file" > "zipdir/$(basename "$file").gz"
done < filelist
No bash / dash, você também pode converter o acima para um one-liner:
while IFS= read file; do gzip -c "$file" > "zipdir/$(basename "$file").gz"; done < filelist
Em outros shells (por exemplo, tcsh ou zsh)
bash -c 'while IFS= read file; do gzip -c "$file" > "zipdir/$(basename "$file").gz"; done < filelist'
fará o trabalho.
Se o bash não estiver presente, ele pode ser substituído por traço.
Como funciona
-
... < filelist
redireciona o conteúdo de filelist para...
. -
while IFS= read file; do ... done
passa pelas linhas na filelist, armazena o conteúdo da linha atualmente processada na variável arquivo e executa...
.IFS=
modifica o separador de arquivos interno. Isso é necessário para manipular espaços múltiplos, iniciais e finais corretamente. -
gzip -c "$file" > "zipdir/$(basename "$file").gz"
compactou o arquivo atualmente processado e armazena a saída em um arquivo com o mesmo nome mais uma extensão .gz no diretório zipdir .Aqui
basename "$file"
extrai o nome do arquivo nu do caminho do arquivo.