PERINGATAN: Tanpa solusi khusus, GNU cp --attributes-only
akan memotong file tujuan, setidaknya dalam Precise. Lihat hasil edit di bawah.
Asli:
Dalam situasi ini, Anda mungkin menginginkan --attributes-only
opsi GNU cp , bersama dengan --archive
, ketika kode ini dicoba dan diuji, apakah semua atribut filesystem-agnostik dan tidak mengikuti symlink (mengikutinya bisa buruk!):
cp --archive --attributes-only /source/of/failed/backup/. /destination/
Seperti halnya file, cp
aditif dengan atribut yang diperluas: jika kedua sumber dan tujuan memiliki atribut yang diperluas, ia menambahkan atribut yang diperluas sumber ke tujuan (daripada menghapus semua xattrs tujuan terlebih dahulu). Meskipun ini mencerminkan bagaimana cp
perilaku jika Anda menyalin file ke pohon yang ada, itu mungkin tidak seperti yang Anda harapkan.
Perhatikan juga bahwa jika Anda tidak menyimpan tautan keras pertama kali rsync
tetapi ingin mempertahankannya sekarang cp
tidak akan memperbaikinya untuk Anda; Anda mungkin terbaik menjalankan kembali rsync
dengan opsi yang tepat (lihat jawaban saya yang lain ) dan bersabar.
Jika Anda menemukan pertanyaan ini sambil berusaha memisahkan dan menggabungkan kembali konten metadata / file dengan sengaja maka Anda mungkin ingin melihat metastore yang ada di dalam repositori Ubuntu.
Sumber: manual GNU coreutils
Diedit untuk menambahkan:
cp
dari GNU coreutils
> = 8.17 dan di atas akan berfungsi seperti yang dijelaskan, tetapi coreutils <= 8.16 akan memotong file ketika memulihkan metadata mereka. Jika ragu, jangan gunakan cp
dalam situasi ini; gunakan rsync
dengan opsi yang tepat dan / atau bersabarlah.
Saya tidak akan merekomendasikan hal ini kecuali jika Anda sepenuhnya memahami apa yang Anda lakukan, tetapi GNU sebelumnya cp
dapat dicegah memotong file menggunakan trik 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);
}