cp -r -l no MacOS (cópia recursiva preservando links físicos)

12

Estou tentando copiar uma árvore de diretórios preservando recursivamente os hardlinks para o arquivo. Usando o gnu cp, isso funcionaria com o sinalizador -l. O cp recriaria a estrutura de diretórios, mas não precisaria copiar o conteúdo de cada arquivo.

Isso é preliminar para um backup. Primeiro, quero fazer uma cópia barata (com vínculo direto) do backup anterior e depois sincronizar novamente o diretório de origem nessa cópia. Aproximadamente:

 cp -r -l yesterdays_backup todays_backup
 rsync -a source_dir todays_backup

Infelizmente, o cp do OSX não suporta o sinalizador -l, até onde eu sei, o cpio não suporta cópias recursivas. A outra alternativa é pax, mas isso leva a que toda a estrutura de diretórios seja copiada:

 pax -rw backups/yesterdays_backup backups/todays_backup

transforma:

 yesterdays_backup
 |
  \source_dir (...)

para:

 todays_backup
 |
  \backups
          \yesterdays_backup
                            \source_dir(...)

Deve haver uma maneira fácil / óbvia de fazer isso, mas atualmente estou perplexo ... Alguma alternativa para cpio e pax? Eu gostaria de evitar a instalação do gnu cp.

Estou ciente do Timemachine, mas isso não fará o backup adequado dos diretórios criptografados de forma incremental.


fonte
usando find juntamente com cpio contornar a falta de cpio recursiva, conforme descrito aqui: ( mikerubel.org/computers/rsync_snapshots/#Incremental ), mas não parece muito elegante ...

Respostas:

16

É fácil o suficiente instalar o cp a partir do MacPorts; no entanto, se você não quiser, ou deseja criar um script portátil, você tem três opções:

rsync

rsync --archive --link-dest=../yesterdays_backup backups/yesterdays_backup\
   backups/todays_backup

cpio

mkdir backups/todays_backup
cd backups/yesterdays_backup
find . -print | cpio -p -al ../todays_backup

pax

mkdir backups/todays_backup
cd backups/yesterdays_backup
pax -rwl . ../todays_backup
Paul Wagland
fonte
E se a origem e o destino estiverem em discos diferentes? O rsync ainda preservaria os links físicos da fonte na cópia feita no destino?
lpacheco
7

É fácil instalar o coreutilspacote do MacPorts que contém o cpcomando GNU renomeado para gcp.

Porém, melhor ainda, as versões mais recentes do rsync, incluindo a do OS X 10.5, pelo menos, suportam a opção --link-dest, que deve eliminar a necessidade do cp -al inicial. Veja aqui . Também é uma boa prática usar a opção -E para copiar atributos estendidos, ACLs etc.


fonte
1

Embora cpionão ofereça suporte direto à cópia recursiva, você pode alimentar a lista exata de arquivos que deseja copiar em sua entrada padrão e obter o efeito de uma cópia recursiva usando a findcanalização cpio. Isso é diretamente análogo ao uso do GNU tarcom as opções -T -(o que significa ler a lista de arquivos para fazer backup da entrada padrão).

Jonathan Leffler
fonte
1

Acredito que o que você deseja também pode ser alcançado ditto yesterdays_backup todays_backup. Por padrão, dittofaz uma cópia recursiva que preserva links físicos, ACLs e atributos estendidos.


fonte
o problema é que a cópia não é mais barata quando o objetivo é criar links físicos no escopo do diretório. ditto pode preservá-los quando eles existem, mas não pode ser dito para vincular em vez de criar uma duplicata.
amigos estão dizendo
Acho que nem se pode dizer o mesmo para preservar os links físicos do diretório. página homem diz que só faz arquivo links de disco rígido
Chris F Carroll
0

+1 para a resposta de Pauls. ditto seria uma opção, mas somente se usado em conjunto com o find - preserva os links físicos, mas apenas dentro dos diretórios.

Florenz Kley
fonte