Supondo que você esteja na pasta raiz onde estão todos os diretórios para compactação (no seu caso, / ), use o comando find juntamente com xargs , por exemplo,
find dir1/ -name "*.fit" -print0 | xargs -i% -r0 sh -c 'mkdir -vp "$(dirname "/another_dir/%")" && gzip -vc "%" | tee "/another_dir/%".gz > /dev/null && rm -v "%"'
Observação: você também pode substituir | tee "/another_dir/%".gz > /dev/null por > "/another_dir/%".gz .
Isso localizará todos os arquivos .fit em dir1/ e os transmitirá ao comando xargs para análise em que % é substituído por cada arquivo.
O comando xargs irá:
- crie a pasta vazia (
mkdir) com seus arent p (-p) como um espaço reservado, - comprima o arquivo fornecido (
%) na saída padrão (-c) e redirecione a saída compactada paratee, -
teesalvará a entrada compactada no arquivo.gz(já queteepor padrão imprime a entrada na tela do terminal, enviá-la para/dev/nullirá suprimi-la, mas ainda salvará o conteúdo no arquivo fornecido ).
Após a compactação bem-sucedida, remova o original ( rm ). Você sempre pode remover essa parte, a fim de removê-los manualmente depois de verificar seus arquivos compactados.
É importante que você esteja na pasta relativa ao seu dir1/ , portanto, todos os caminhos retornados por find são relativos à pasta atual, portanto, você não precisa converter caminhos absolutos para o parente (isso ainda pode ser feito por realpath , por exemplo, realpath --relative-to=$absolute $current , mas isso apenas complicará demais o comando acima).
No macOS, para usar o argumento -r para xargs , você precisa instalar o comando GNU xargs ( brew install xargs ) e usar o comando gxargs . Semelhante em outros sistemas BSD.
Pergunta relacionada: gzip vários arquivos em diferentes diretórios e copie para o novo diretório .