Como gzip e copiar arquivos mantendo sua estrutura de diretórios?

1

Como posso gzip e copiar arquivos para outra pasta mantendo sua estrutura de diretório com um comando no Linux?

Por exemplo, eu tenho:

/dir1
/dir1/file1.fit
/dir1/file2.fit
/dir1/file3.fit
/dir1/dir2/file1.fit
/dir1/dir2/file2.fit
/dir1/dir2/file3.fit

Depois que eu uso um comando (digamos que eu copio /dir1 para /another_dir ), eu quero:

/another_dir/dir1
/another_dir/dir1/file1.fit.gz
/another_dir/dir1/file2.fit.gz
/another_dir/dir1/file3.fit.gz
/another_dir/dir1/dir2/file1.fit.gz
/another_dir/dir1/dir2/file2.fit.gz
/another_dir/dir1/dir2/file3.fit.gz

Aqui /another_dir é na verdade outro disco rígido. Como não há espaço suficiente nesta unidade de destino (é um dado de 2 TB!), Por favor, não me sugira copiar os arquivos primeiro e depois gzipar todos (ou vice-versa). Da mesma forma, os arquivos gz não devem permanecer na pasta de origem após a operação.

    
por shelfDestruction 22.12.2016 / 10:13

2 respostas

2

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 para tee ,
  • tee salvará a entrada compactada no arquivo .gz (já que tee 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 .

    
por 22.12.2016 / 13:34
1

Eu não estou ciente do comando único para fazê-lo, mas em ServerFault é um exemplo de script simples que implementa o mesmo. Observe que ele não preserva permissões de arquivo ou tempos de acesso / modificação e pode ter problemas se os nomes de arquivos contiverem espaços ou algo semelhante.

    
por 22.12.2016 / 13:03