OSTRZEŻENIE: Bez specjalnych obejść GNU cp --attributes-only
obetnie pliki docelowe, przynajmniej w Precise. Zobacz edycję poniżej.
Oryginalny:
W tej sytuacji prawdopodobnie chcesz opcji GNU cp --attributes-only
, wraz z --archive
wypróbowanym i przetestowanym kodem, robi wszystkie atrybuty niezależne od systemu plików i nie podąża za dowiązaniami symbolicznymi (podążanie za nimi może być złe!):
cp --archive --attributes-only /source/of/failed/backup/. /destination/
Podobnie jak w przypadku plików, cp
jest addytywny z rozszerzonymi atrybutami: jeśli zarówno źródło, jak i miejsce docelowe mają atrybuty rozszerzone, dodaje rozszerzone atrybuty źródła do miejsca docelowego (zamiast najpierw usuwać wszystkie xattry miejsca docelowego). Chociaż odzwierciedla to cp
zachowanie w przypadku kopiowania plików do istniejącego drzewa, może nie być to oczekiwane.
Zauważ też, że jeśli nie zachowałeś twardych linków za pierwszym razem, rsync
ale chcesz je teraz zachować, to cp
nie naprawisz tego za ciebie; prawdopodobnie najlepiej będzie, rsync
jeśli ponownie uruchomisz z odpowiednimi opcjami (patrz moja inna odpowiedź ) i będziesz cierpliwy.
Jeśli znalazłeś to pytanie podczas celowego rozdzielania i ponownego łączenia zawartości metadanych / plików, możesz rzucić okiem na metastore, który znajduje się w repozytoriach Ubuntu.
Źródło: Podręcznik GNU coreutils
Edytowano, aby dodać:
cp
od GNU coreutils
> = 8.17 i nowszych będzie działać zgodnie z opisem, ale coreutils <= 8.16 obetnie pliki podczas przywracania ich metadanych. W razie wątpliwości nie używaj cp
w tej sytuacji; używaj rsync
z odpowiednimi opcjami i / lub bądź cierpliwy.
Nie poleciłbym tego, chyba że w pełni rozumiesz, co robisz, ale wcześniejszym GNU cp
można zapobiec obcinaniu plików za pomocą sztuczki 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);
}