ВНИМАНИЕ: Без специальных обходных путей 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);
}