Já copiei terabytes de arquivos, rsync
mas esqueci de usá-lo --archive
para preservar os atributos especiais dos arquivos.
rsync
Desta vez, tentei executar novamente, --archive
mas era muito mais lento do que eu esperava. Existe alguma maneira fácil de fazer isso mais rápido, copiando metadados recursivamente?
filesystem
rsync
metadata
Mohammad
fonte
fonte
Respostas:
Ok, você pode copiar proprietário, grupo, permissão e marcas de tempo usando o
--reference
parâmetro parachown
,chmod
,touch
. Aqui está um script para fazer issoVocê deve executá-lo com
sudo
(para permitir chown) e com dois parâmetros: diretório de origem e destino. O script apenas faz eco do que faria. Se satisfeito, altere a linhamyecho=echo
commyecho=
.fonte
touch --reference=otherfile file
. Atualizada a respostatouch
por design, apenas altera os tempos de modificação e acesso, o tempo de "criação" não é afetado. (Eu acho que o ext2 / 3 não suporta a alteração do ctime, mas pode ser importante se você estiver usando NTFS ou algo semelhante).-c
opção aotouch
comando para impedir a criação de arquivos vazios no arquivo$dst_path
.AVISO: Sem soluções especiais, o GNU
cp --attributes-only
truncará os arquivos de destino, pelo menos no Precise. Veja a edição abaixo.Original:
Nesta situação, você provavelmente deseja a
--attributes-only
opção do GNU cp , juntamente com--archive
, como é um código testado e testado, faz todos os atributos independentes do sistema de arquivos e não segue links simbólicos (segui-los pode ser ruim!):Como nos arquivos,
cp
é aditivo com atributos estendidos: se a origem e o destino tiverem atributos estendidos, os atributos estendidos da fonte serão adicionados ao destino (em vez de excluir primeiro todos os xattrs do destino). Embora isso reflita comocp
se comporta se você copiar arquivos para uma árvore existente, pode não ser o que você espera.Observe também que, se você não preservou os links físicos na primeira vez,
rsync
mas deseja preservá-los agora,cp
não o corrigirá; provavelmente é melhor executar novamentersync
com as opções corretas (veja minha outra resposta ) e ser paciente.Se você encontrou essa pergunta enquanto procurava deliberadamente separar e recombinar o conteúdo de metadados / arquivos, pode dar uma olhada no metastore que está nos repositórios do Ubuntu.
Fonte: Manual do GNU coreutils
Editado para adicionar:
cp
do GNUcoreutils
> = 8.17 e superior funcionará como descrito, mas o coreutils <= 8.16 truncará arquivos ao restaurar seus metadados. Em caso de dúvida, não usecp
nesta situação; usersync
com as opções certas e / ou seja paciente.Eu não recomendaria isso, a menos que você entenda completamente o que está fazendo, mas o GNU anterior
cp
pode ser impedido de truncar arquivos usando o truque LD_PRELOAD :fonte
errorno
deveria sererrno
, certo?rsync
com as opções certas é uma resposta para outra pergunta ...Tratar a pergunta como "o rsync possui apenas metadados para copiar; por que é tão lento e como posso torná-lo mais rápido?":
rsync
geralmente usa mtimes iguais como heurística para detectar e pular arquivos inalterados. Sem--archive
(especificamente, sem--times
), os tempos dos arquivos de destino permanecem definidos para o tempo em que você os sincroniza, enquanto os tempos dos arquivos de origem permanecem intactos (ignorando os truques manuais por você). Sem garantias externas suas de que o conteúdo dos arquivos de origem não foi alterado, o rsync deve assumir que eles podem ter e, portanto, deve soma-los e / ou copiá-los para o destino novamente. Isso, mais o fato--whole-file
implícito nas sincronizações local-> local, tornarsync
sem--times
aproximadamente equivalente aocp
das sincronizações locais.Desde que a atualização do conteúdo dos arquivos de destino seja aceitável ou se os arquivos de origem estiverem intocados desde a cópia original, você deve encontrar
rsync --archive --size-only
mais rapidamente do que um rsync ingênuo.Em caso de dúvida quanto ao processo de
rsync
cópia que está demorando tanto,rsync --archive --dry-run --itemize-changes ...
informa com detalhes exaustivos, embora concisos.fonte
Nas transferências locais, quando a origem e o destino estão em sistemas de arquivos montados localmente,
rsync
sempre copia todo o conteúdo dos arquivos. Para evitar isso, você pode usarfonte
rsync
não usar o atalho quando os arquivos estiverem no caminho local, mas não impede arsync
cópia do conteúdo.Eu tive que fazer isso remotamente em outro computador para não poder usar - referência
Eu usei isso para fazer o script ...
find -printf "touch -d \"%Tc\" \"%P\"\n" >/tmp/touch.sh
Mas verifique se não há nomes de arquivos com "neles primeiro ...
find | grep '"'
Copie o touch.sh para o seu computador remoto e execute ...
cd <DestinationFolder>; sh /tmp/touch.sh
Também há opções em find -printf para imprimir usuário, nome do grupo, se você quiser copiá-las.
fonte
find
. Eu estava na mesma situação - esqueci de copiar atributos, os discos de origem e de destino já estavam em máquinas diferentes e realmente não queriam reverter isso.