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
-
... < filelistredireciona o conteúdo de filelist para.... -
while IFS= read file; do ... donepassa 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.