Eu abordaria isso como três etapas separadas, usando $SOURCE
e $DEST
como seus diretórios de origem e de destino.
-
Recrie a estrutura de diretórios de origem no diretório de destino
find $SOURCE -type d | sed -e "s~^$SOURCE~~" | xargs -r -I dir mkdir -p "$DEST"/"dir"
-
Mova todos os arquivos que não precisam ser descompactados
find $SOURCE -type f -not -name '*.gz' | sed -e "s~^$SOURCE/~~" | xargs -r -I file cp "$SOURCE"/"file" "$DEST"/"file"
-
Descompacte todos os arquivos compactados no diretório de destino
find $SOURCE -type f -name '*.gz' | sed -e "s~^$SOURCE~~" | sed -e "s~.gz$~~" | xargs -r -I file bash -c 'gzip -dc "'"$SOURCE"'"/"file".gz > "'"$DEST"'"/"file"'
Dito isso, recomendamos que você use rsync -av
para copiar todos os arquivos e find . -name '*.gz' -exec gunzip \{\} \;
no diretório de destino para descompactar os arquivos. Esta é uma abordagem muito mais simples, com menos armadilhas potenciais. (As três etapas acima funcionaram para mim em um pequeno diretório de teste com um número limitado de arquivos e nomes de arquivos relativamente simples; YMMV para um caso de uso mais complexo.)