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!):
cp --archive --attributes-only /source/of/failed/backup/. /destination/
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 como cp
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 novamente rsync
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 GNU coreutils
> = 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 use cp
nesta situação; use rsync
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 :
/*
* File: no_trunc.c
* Author: D.J. Capelis with minor changes by Zak Wilcox
*
* Compile:
* gcc -fPIC -c -o no_trunc.o no_trunc.c
* gcc -shared -o no_trunc.so no_trunc.o -ldl
*
* Use:
* LD_PRELOAD="./no_trunc.so" cp --archive --attributes-only <src...> <dest>
*/
#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>
extern int errorno;
int (*_open)(const char *pathname, int flags, ...);
int (*_open64)(const char *pathname, int flags, ...);
int open(const char *pathname, int flags, mode_t mode) {
_open = (int (*)(const char *pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
flags &= ~(O_TRUNC);
return _open(pathname, flags, mode);
}
int open64(const char *pathname, int flags, mode_t mode) {
_open64 = (int (*)(const char *pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
flags &= ~(O_TRUNC);
return _open64(pathname, flags, mode);
}