ВНИМАНИЕ: Без специальных обходных путей GNU cp --attributes-only
будет обрезать конечные файлы, по крайней мере, в Precise. Смотрите редактирование ниже.
Оригинал:
В этой ситуации вы, вероятно, захотите, чтобы --attributes-only
опция GNU cp , вместе с --archive
проверенным и протестированным кодом, выполняла все атрибуты, независимые от файловой системы, и не следовала по символическим ссылкам (следовать им может быть плохо!):
cp --archive --attributes-only /source/of/failed/backup/. /destination/
Как и в случае с файлами, cp
он дополняет расширенные атрибуты: если у источника и получателя есть расширенные атрибуты, он добавляет расширенные атрибуты источника к месту назначения (вместо того, чтобы сначала удалить все xattrs назначения). Хотя это отражает cp
поведение при копировании файлов в существующее дерево, это может быть не так, как вы ожидаете.
Также обратите внимание, что если вы не сохранили жесткие ссылки в первый раз, rsync
но хотите сохранить их сейчас, то cp
это не исправит для вас; вам, вероятно, лучше всего выбрать rsync
правильные варианты (см. мой другой ответ ) и быть терпеливым.
Если вы нашли этот вопрос, пытаясь преднамеренно разделить и рекомбинировать содержимое метаданных / файлов, вы можете взглянуть на metastore, который находится в репозиториях Ubuntu.
Источник: руководство по GNU coreutils
Отредактировано, чтобы добавить:
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);
}