चेतावनी: विशेष वर्कआर्डर के बिना, GNU cp --attributes-only
गंतव्य फ़ाइलों को कम-से-कम सटीक में मिटा देगा। नीचे संपादित देखें।
मूल:
इस स्थिति में आप शायद GNU cp का --attributes-only
विकल्प चाहते हैं , साथ में --archive
, जैसा कि इसकी कोशिश की गई और परीक्षण किया गया कोड है, सभी फाइलसिस्टम-अज्ञेय गुण करता है और सह्लिंक का पालन नहीं करता (उनका बुरा हो सकता है!)।
cp --archive --attributes-only /source/of/failed/backup/. /destination/
फ़ाइलों के साथ के रूप में, cp
विस्तारित विशेषताओं के साथ additive है: यदि स्रोत और गंतव्य दोनों ने विशेषताओं को बढ़ाया है तो यह स्रोत की विस्तारित विशेषताओं को गंतव्य में जोड़ता है (बजाय गंतव्य के सभी xattrs को हटाने से पहले)। जब यह दर्पण दिखाता है कि cp
यदि आप मौजूदा पेड़ में फ़ाइलों को कॉपी करते हैं तो यह कैसे हो सकता है।
यह भी ध्यान दें कि यदि आपने पहली बार हार्ड लिंक को संरक्षित नहीं किया है, rsync
लेकिन अब उन्हें संरक्षित करना चाहते हैं, तो cp
यह आपके लिए ठीक नहीं होगा ; आप शायद rsync
सही विकल्पों (मेरे अन्य उत्तर देखें ) और रोगी होने के साथ फिर से बेहतर कर रहे हैं ।
यदि आपको यह प्रश्न जानबूझकर अलग और पुन: संयोजन मेटाडेटा / फ़ाइल सामग्री को देखते हुए मिला है, तो आप मेटास्टोर पर एक नज़र डालना चाह सकते हैं जो उबंटू रिपॉजिटरी में है।
स्रोत: GNU कोरुटिल्स मैनुअल
जोड़ने के लिए संपादित:
cp
GNU से coreutils
= = 8.17 और ऊपर वर्णित के रूप में काम करेगा, लेकिन कोरडिल्स <= 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);
}