CẢNH BÁO: Không có cách giải quyết đặc biệt, GNU cp --attributes-only
sẽ cắt bớt các tệp đích, ít nhất là trong Chính xác. Xem chỉnh sửa dưới đây.
Nguyên:
Trong tình huống này, bạn có thể muốn --attributes-only
tùy chọn GNU cp , cùng với --archive
, vì nó đã thử và kiểm tra mã, tất cả các thuộc tính không biết hệ thống tập tin và không tuân theo các liên kết tượng trưng (theo chúng có thể xấu!):
cp --archive --attributes-only /source/of/failed/backup/. /destination/
Cũng như các tệp, cp
là phụ gia với các thuộc tính mở rộng: nếu cả nguồn và đích đều có thuộc tính mở rộng thì nó sẽ thêm thuộc tính mở rộng của nguồn vào đích (thay vì xóa tất cả các xattrs của đích trước). Mặc dù điều này phản ánh cách cp
hành xử nếu bạn sao chép tệp vào một cây hiện có, nó có thể không như bạn mong đợi.
Cũng lưu ý rằng nếu bạn không bảo quản các liên kết cứng lần đầu tiên rsync
nhưng muốn giữ chúng ngay bây giờ thì cp
bạn sẽ không khắc phục điều đó cho bạn; Bạn có lẽ tốt nhất nên chạy lại rsync
với các tùy chọn phù hợp (xem câu trả lời khác của tôi ) và kiên nhẫn.
Nếu bạn tìm thấy câu hỏi này trong khi tìm cách để cố tình siêu dữ liệu riêng biệt và tái kết hợp / nội dung tập tin sau đó bạn có thể muốn có một cái nhìn tại metastore đó là trong kho của Ubuntu.
Nguồn: Hướng dẫn sử dụng GNU coreutils
Chỉnh sửa để thêm:
cp
từ GNU coreutils
> = 8.17 trở lên sẽ hoạt động như mô tả, nhưng coreutils <= 8.16 sẽ cắt bớt các tệp khi khôi phục siêu dữ liệu của chúng. Nếu nghi ngờ, không sử dụng cp
trong tình huống này; sử dụng rsync
với các tùy chọn phù hợp và / hoặc kiên nhẫn.
Tôi sẽ không khuyến nghị điều này trừ khi bạn hoàn toàn hiểu những gì bạn đang làm, nhưng GNU trước đó cp
có thể được ngăn chặn cắt bớt các tệp bằng thủ thuật 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);
}