Como copiar diretórios com a preservação de hardlinks?

36

Como mover diretórios que possuem arquivos em comum de uma para outra partição?

Vamos supor que temos uma partição montada em /mnt/X com diretórios compartilhando arquivos com hardlinks. Como mover esses diretórios para outra partição, seja /mnt/Y preservando esses hardlinks.

Para uma melhor ilustração, o que quero dizer com "diretórios compartilhando arquivos em comum com hardlinks", aqui está um exemplo:

# let's create three of directories and files
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
# and copy it with hardlinks
cp -r -l a hardlinks_of_a

Para ser mais específico, vamos supor que o tamanho total dos arquivos seja 10G e cada arquivo tenha 10 hardlinks. A questão é como movê-lo para o destino usando 10G (alguém pode dizer sobre copiá-lo com 100G e, em seguida, executar a deduplicação - não é o que estou perguntando)

    
por Grzegorz Wierzowiecki 29.07.2012 / 18:41

5 respostas

26

Primeira resposta: o caminho GNU

O GNU cp -a copia de forma recursiva a preservação da estrutura e dos metadados possíveis. Links rígidos entre arquivos no diretório de origem estão incluídos nele. Para selecionar a preservação do link físico especificamente, sem todos os outros recursos de -a , use --preserve=links .

mkdir src
cd src
mkdir -p a/{b,c,d}/{x,y,z}
touch a/{b,c,d}/{x,y,z}/f{1,2,3,4,5}
cp -r -l a hardlinks_of_a
cd ..
cp -a src dst
    
por 29.07.2012 / 23:38
35

O rsync tem uma opção -H ou --hard-links para isso, e tem os benefícios usuais do rsync de poder ser interrompido e reiniciado, e de ser executado novamente para lidar eficientemente com quaisquer arquivos que foram alterados durante / após a execução anterior.

-H, --hard-links
    This tells rsync to look for hard-linked files in
    the source and link together the corresponding
    files on the destination.  Without  this option,
    hard-linked files in the source are treated as
    though they were separate files. [...]

Leia a página rsync man e procure por -H. Há muito mais detalhes sobre certas advertências.

    
por 30.07.2012 / 06:13
14

Terceira resposta: o caminho POSIX

O POSIX não padronizou o utilitário tar , embora tenha padronizado o formato de arquivo tar . O utilitário POSIX para manipular arquivos tar é chamado de pax e tem o recurso bônus de poder fazer o pacote e desempacotar a operação em um único processo.

mkdir dst
pax -rw src dst
    
por 31.07.2012 / 20:42
10

Segunda resposta: o antigo caminho UNIX

Crie um arquivo tar no diretório de origem, envie-o por um pipe e descompacte-o no diretório de destino.

# create src as before
(cd src;tar cf - .) | (mkdir dst;cd dst;tar xf -)
    
por 31.07.2012 / 20:40
9

Fonte: link

O que você precisa para fazer uma cópia exata é

rsync -az -H --delete --numeric-ids /path/to/source/ /path/to/dest/
    
por 29.05.2014 / 21:32