OSTRZEŻENIE: Bez specjalnych obejść GNU cp --attributes-onlyobetnie pliki docelowe, przynajmniej w Precise. Zobacz edycję poniżej.
Oryginalny:
W tej sytuacji prawdopodobnie chcesz opcji GNU cp --attributes-only, wraz z --archivewypró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, cpjest 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 cpzachowanie 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, rsyncale chcesz je teraz zachować, to cp nie naprawisz tego za ciebie; prawdopodobnie najlepiej będzie, rsyncjeś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ć:
cpod 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 cpw tej sytuacji; używaj rsyncz odpowiednimi opcjami i / lub bądź cierpliwy.
Nie poleciłbym tego, chyba że w pełni rozumiesz, co robisz, ale wcześniejszym GNU cpmoż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);
}