Como copiar diretórios preservando hardlinks?

40

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

Vamos supor que tenhamos uma partição montada /mnt/Xcom diretórios que compartilham arquivos com hardlinks. Como mover esses diretórios para outra partição, /mnt/Ypreservando esses hardlinks.

Para uma melhor ilustração, o que quero dizer com "diretórios que compartilham 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 links físicos. A questão é como movê-lo para o destino usando 10G (alguém pode dizer sobre copiá-lo com 100G e depois executar a desduplicação - não é isso que estou perguntando)

Grzegorz Wierzowiecki
fonte

Respostas:

29

Primeira resposta: O caminho GNU

O GNU cp -acopia recursivamente preservando o máximo de estrutura e metadados possível. Os links físicos entre os arquivos no diretório de origem estão incluídos nisso. Para selecionar a preservação do link físico especificamente, sem todos os outros recursos do -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
Alan Curry
fonte
3
+1 no tar, -1 para usar argumentos específicos do gnu para cp.
WhyNotHugo
Você deu três respostas em uma. Você pode dividi-los em três para que possam ser comentados e avaliados separadamente? (Dica: você pode editar isso, deixando apenas um - por exemplo, "cp -a". Depois, adicione mais dois, para "tar" e "pax")
Grzegorz Wierzowiecki 31/07/12
11
@GrzegorzWierzowiecki divisão realizada #
Alan Curry
6
@ Hugo: não há nada de errado em usar argumentos específicos do GNU para ferramentas padrão. Atualmente, as versões GNU são o padrão de fato, e mesmo quando não estavam pré-instaladas, era prática comum instalar ferramentas GNU (eu sei que sempre instalava - elas eram simplesmente melhores do que, por exemplo, versões solaris e * bsd , e eles forneceram consistência entre diferentes * nixes). Provavelmente, é uma boa prática apontar GNUisms quando você os usa, mas não é necessário. Grzegorz também não disse "não no linux", então é razoável supor que esse é o ambiente de que ele está falando.
cas
11
@WhyNotHugo: Como o POSIX "pode ​​ser mais padrão?". POSIX é o material que nos trouxe onde estamos. Você sabia que todas as versões do Windows desde o Windows NT são totalmente compatíveis com POSIX? Eles têm uma limitação de comprimento de caminho de 255 caracteres ao usar as funções de E / S do arquivo POSIX, o que os torna inúteis. Você sabia que Solaris, Irix, HP-UX são todos compatíveis com POSIX, e ainda assim todos os argumentos para suas ferramentas são diferentes (por exemplo, tar). cp -a é um requisito mínimo para qualquer versão cp que queira substituir a cópia GNU.
Johannes Overmann
37

O rsync tem uma opção -Hou --hard-links, e tem os benefícios usuais do rsync de poder ser parado e reiniciado e ser reexecutado para lidar com eficiência com qualquer arquivo que foi alterado 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 rsyncpágina do manual e procure -H. Há muito mais detalhes sobre advertências específicas.

cas
fonte
2
Eu verifiquei - funciona.
Grzegorz Wierzowiecki 31/07/2012
sim eu sei. Eu o uso há anos nos meus scripts de backup. também para mover arquivos entre sistemas de arquivos, como na sua pergunta.
cas
O rsync usa grandes quantidades de memória ao criar sua lista de arquivos. Para mim, depois de muitas horas de "Lista de arquivos de construção ...", ela preencheu meus 16 GB de memória e foi liberada por não ter copiado nada. YMMV.
Msc
2
De man rsync: a partir do rsync 3.0.0, o algoritmo recursivo usado agora é uma varredura incremental que utiliza muito menos memória do que antes e inicia a transferência após a varredura dos primeiros diretórios. Essa varredura incremental afeta apenas nosso algoritmo de recursão e não altera uma transferência não recursiva. Também é possível apenas quando as duas extremidades da transferência são pelo menos a versão 3.0.0. Observe que ambos --delete-beforee --delete-afterdesativar esse algoritmo aprimorado.
22418
Além disso, embora rsyncseja incrivelmente útil também, nem sempre é a melhor ferramenta para todos os trabalhos. Hoje em dia, prefiro usar conjuntos de dados do ZFS para poder fazer uma captura instantânea e zfs sendeles - eu uso principalmente o rsync em sistemas de arquivos não-ZFS. btrfspossui um instantâneo semelhante + capacidade de envio.
22418
14

Terceira resposta: o caminho POSIX

O POSIX não padronizou o tarutilitário, apesar de padronizar o tarformato de arquivo. O utilitário POSIX para manipulação de arquivos tar é chamado paxe possui o recurso de bônus de poder fazer a operação de empacotamento e descompactação em um único processo.

mkdir dst
pax -rw src dst
Alan Curry
fonte
10

Segunda resposta: O caminho antigo do 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 -)
Alan Curry
fonte
11
verificado -> funciona. Hardlinks preservados.
Grzegorz Wierzowiecki 31/07/2012
11
Alguma idéia de por que isso realmente preserva os hardlinks?
Peterph
11
Porque tarpreserva links físicos. No tar GNU, pelo menos, você pode desabilitar esse comportamento com--hard-dereference
cas 2/15
No meu caso, tentando copiar uma grande hierarquia de diretórios (um backup do TimeMachine), o tar preservou alguns links físicos, mas replicou o arquivo em alguns casos. Eu acho que isso ocorre porque o tar xnão tem a lista completa de arquivos, pois os arquivos ainda estão sendo canalizados a partir do tar c. Provavelmente, se você salvou o arquivo inteiro antes de extraí-lo, tudo bem. Eu ficaria muito feliz se alguém pudesse confirmar essa teoria.
msc 02/02
10

Fonte: http://www.cyberciti.biz/faq/linux-unix-apple-osx-bsd-rsync-copy-hard-links/

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

rsync -az -H --delete --numeric-ids /path/to/source/ /path/to/dest/
Pykler
fonte
Veja meu comentário sobre o rsync acima.
Msc
11
Suspeito que isso não copie ACLs, atributos estendidos etc. A versão Linux também tem as opções -A e -X para preservá-las, mas acho que você não teve sorte no MacOS.
Edward Falk