ПОПЕРЕДЖЕННЯ: Без спеціальних обхідних завдань GNU cp --attributes-only
буде усікати цільові файли, принаймні в точності. Дивіться редагування нижче.
Оригінал:
У цій ситуації вам, мабуть, потрібна --attributes-only
опція GNU cp разом із --archive
, як це перевіреним і перевіреним кодом, виконує всі атрибути файлової системи та не слідкує за посиланнями (слідування за ними може бути поганим!):
cp --archive --attributes-only /source/of/failed/backup/. /destination/
Як і у файлах, cp
є добавкою з розширеними атрибутами: якщо і джерело, і пункт призначення мають розширені атрибути, він додає розширені атрибути джерела до пункту призначення (а не видаляє спочатку всі пункти призначення). Хоча це відображає, як cp
поводиться, якщо ви копіюєте файли в існуюче дерево, можливо, це не те, що ви очікуєте.
Також зауважте, що якщо ви не зберегли жорсткі посилання з першого разу, rsync
але хочете зберегти їх зараз, то cp
це не виправить це; вам, мабуть, найкраще попрацювати rsync
з правильними варіантами (див. моє іншу відповідь ) і набратися терпіння.
Якщо ви знайшли це запитання, шукаючи навмисне розділення та рекомбінацію вмісту метаданих / файлів, то, можливо, ви захочете поглянути на metastore який знаходиться у сховищах Ubuntu.
Джерело: Посібник з ядерних програм GNU
Відредаговано, щоб додати:
cp
від GNU coreutils
> = 8.17 і вище буде працювати, як описано, але coreutils <= 8.16 буде скорочувати файли при відновленні їх метаданих. Якщо ви сумніваєтесь, не використовуйте cp
в цій ситуації; використовувати rsync
з потрібними опціями і / або бути терплячим.
Я б не рекомендував цього, якщо ви повністю не зрозумієте, що ви робите, але раніше GNU cp
можна запобігти обрізанню файлів за допомогою трюку 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);
}