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
, -
tee
salvará a entrada compactada no arquivo.gz
(já quetee
por padrão imprime a entrada na tela do terminal, enviá-la para/dev/null
irá 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 .