फ़ाइल की वास्तविक सामग्री के बिना केवल फ़ाइल विशेषताओं (मेटाडेटा) की प्रतिलिपि कैसे करें?


21

मैंने पहले ही फ़ाइलों की टेराबाइट्स कॉपी कर ली हैं, rsyncलेकिन मैं --archiveफ़ाइलों की विशेष विशेषताओं को संरक्षित करने के लिए उपयोग करना भूल गया हूं ।

मैंने rsyncइस बार फिर से अमल करने की कोशिश की --archiveलेकिन यह मेरी उम्मीद से कहीं धीमी थी। क्या केवल मेटाडेटा को पुनरावर्ती रूप से कॉपी करके इसे तेजी से करने का कोई आसान तरीका है?


"मेटाडेटा" से आपका मतलब फ़ाइल अनुमति और फ़ाइल स्वामित्व या विस्तारित फ़ाइल विशेषताओं जैसी जटिल चीज़ों से है?
मार्सेल स्टिमबर्ग

वह फाइलसिस्टम जहां स्रोत फाइलें निवास करती हैं, स्थानीय स्तर पर माउंट की जाती हैं या नहीं?
enzotib

मेटाडेटा से मेरा मतलब है कि अनुमति और समय-टिकट। समय-टिकट मेरे लिए विशेष रूप से महत्वपूर्ण हैं।
मोहम्मद

स्रोत और गंतव्य दोनों में फिल्म्स सिस्टम स्थानीय रूप से माउंट किया गया है।
मोहम्मद

जवाबों:


17

ठीक है, आप का उपयोग कर स्वामी, समूह, अनुमति और timestamps कॉपी कर सकते हैं --referenceकरने के लिए पैरामीटर chown, chmod, touch। यहाँ एक स्क्रिप्ट ऐसा करने के लिए है

#!/bin/bash
# Filename: cp-metadata

myecho=echo
src_path="$1"
dst_path="$2"

find "$src_path" |
  while read src_file; do
    dst_file="$dst_path${src_file#$src_path}"
    $myecho chmod --reference="$src_file" "$dst_file"
    $myecho chown --reference="$src_file" "$dst_file"
    $myecho touch --reference="$src_file" "$dst_file"
  done

आपको इसे sudo(चांस की अनुमति देने के लिए) और दो मापदंडों के साथ चलाना चाहिए : स्रोत और गंतव्य निर्देशिका। स्क्रिप्ट केवल यह प्रतिध्वनित करती है कि वह क्या करेगी। यदि संतुष्ट हो तो लाइन myecho=echoको बदल दें myecho=


1
हां, यही मेरी जरूरत है: धन्यवाद। और मैं वास्तव में इसकी सराहना करता हूं कि अगर कोई समय-टिकटों की नकल के लिए चामोद - की तरह कुछ पेश कर सकता है।
मोहम्मद

1
@ मोहम्मद: इसके लिए आप उपयोग कर सकते हैं touch --reference=otherfile file। उत्तर अपडेट किया
enzotib

एक दम बढ़िया। दरअसल मैं अभी टच मैनुअल पढ़ रहा था ;-)
मोहम्मद

बस एक नोट: touchडिजाइन से केवल संशोधन और पहुंच के समय में परिवर्तन होता है, "निर्माण" समय प्रभावित नहीं होता है। (मुझे लगता है कि ext2 / 3 वैसे भी बदलते समय का समर्थन नहीं करता है, लेकिन अगर आप NTFS या इस तरह का उपयोग कर रहे हैं तो यह बात हो सकती है)।
अमरो

यदि आप मौजूदा फ़ाइलों के मेटाडेटा को केवल बदलना चाहते हैं और फ़ाइलों के अस्तित्व को आश्वस्त करने की आवश्यकता नहीं है, तो खाली फ़ाइलों को बनाने से रोकने के -cलिए touchकमांड में एक स्विच जोड़ें $dst_path
सांच्रो

5

चेतावनी: विशेष वर्कआर्डर के बिना, 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 कोरुटिल्स मैनुअल


जोड़ने के लिए संपादित:

cpGNU से 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);
}

errornoहोना चाहिए errno, है ना?
enzotib

इसे हटाने वाला एक त्वरित परीक्षण काम करने लगता है, इसलिए मुझे लगता है कि मैंने मूल में एक अतिरेक / गलती को समाप्त कर दिया है, लेकिन हर कोई अब तक नए कोर्यूटिल्स पर रहेगा।
जकॉ

लेकिन आप rsyncसही विकल्पों के साथ क्या कहते हैं, एक और सवाल का जवाब है ...
जीन पॉल

5

इस प्रश्न को "rsync" के रूप में मानने के लिए केवल मेटाडेटा की प्रतिलिपि है, इसलिए यह इतना धीमा क्यों है, और इसे कैसे तेज़ बना सकते हैं? ":

rsyncआमतौर पर अपरिवर्तित फ़ाइलों का पता लगाने और छोड़ने के लिए एक अनुमान के रूप में समान mtimes का उपयोग करता है। बिना --archive(विशेष रूप से, बिना --times) गंतव्य फ़ाइलों के mtimes आपके द्वारा rsync-ed करने के लिए निर्धारित समय पर बने रहते हैं, जबकि स्रोत फ़ाइलों के mtimes बरकरार रहते हैं (आपके द्वारा मैन्युअल प्रवंचना को अनदेखा करना)। आपके द्वारा बाहरी गारंटी के बिना कि स्रोत फ़ाइलों की सामग्री नहीं बदली गई है, rsync को लगता है कि उनके पास हो सकता है और इसलिए उन्हें चेकसम करना होगा और / या उन्हें फिर से गंतव्य पर कॉपी करना होगा। यह, इस तथ्य को कि --whole-fileस्थानीय-> स्थानीय syncs के लिए निहित है, स्थानीय syncs के लिए लगभग बराबर के rsyncबिना बनाता है ।--timescp

बशर्ते कि गंतव्य फ़ाइलों की सामग्री को अपडेट करना स्वीकार्य है, या अगर मूल प्रतिलिपि के बाद से स्रोत फाइलें अछूती हैं, तो आपको rsync --archive --size-onlyएक भोली rsync की तुलना में जल्दी खोजना चाहिए ।

यदि संदेह rsyncहै कि क्या नकल है जो इतनी देर तक चल रही है, तो rsync --archive --dry-run --itemize-changes ...आपको बताती है कि यदि थकाऊ, विस्तार से।


1
बहुत उपयोगी जानकारी। --आर्किव --साइज़-ओनली एक बेहतरीन कॉम्बो है। यह न केवल गंतव्य में पहले से मौजूद फ़ाइलों को फिर से खोलने से रोकता है, बल्कि यह उनके मेटाडेटा को भी अपडेट करेगा। यह मेरे लिए अप्रत्याशित था, क्योंकि rsync का मैन पेज वर्णन करता है - आकार-केवल "स्किपिंग" फ़ाइलों के रूप में जिनका आकार मेल खाता है। पता चलता है कि यह सिर्फ कॉपी को छोड़ देता है, लेकिन फिर भी मेटाडेटा को सिंक करेगा। आदर्श।
चाड वॉन नाउ

2

स्थानीय स्थानान्तरण में, जब स्रोत और गंतव्य स्थानीय रूप से माउंट किए गए फाइल सिस्टम पर होते हैं, rsyncतो हमेशा संपूर्ण फ़ाइलों की सामग्री की प्रतिलिपि बनाएंगे। इससे बचने के लिए आप उपयोग कर सकते हैं

rsync -a --no-whole-file source dest

मैंने rsync को पूरी तरह से फ़ाइल और --प्रोग्रेस के साथ आज़माया और मैं अभी भी प्रतिलिपि की प्रगति (लगभग 30 एमबी / एस) देख सकता हूं; इसलिए मुझे लगता है कि यह काफी तेज नहीं है, फिर भी। मैं rsync पर अपनी आशा खो रहा हूँ ...
मोहम्मद

इस विकल्प का उपयोग यह बताने के लिए किया जाता है कि rsyncशार्टकट का उपयोग तब न किया जाए जब फाइलें दोनों स्थानीय पथ में हों, लेकिन यह rsyncसामग्री को कॉपी करने से नहीं रोकता है।
जीन पॉल

2

मुझे इसे दूसरे कंप्यूटर पर दूरस्थ रूप से करना था ताकि मैं उपयोग न कर सकूं - संदर्भ

मैंने इसका इस्तेमाल स्क्रिप्ट बनाने के लिए किया था ...

find -printf "touch -d \"%Tc\" \"%P\"\n" >/tmp/touch.sh

लेकिन सुनिश्चित करें कि उन में "पहले कोई फ़ाइल नाम नहीं है ...

find | grep '"'

फिर अपने दूरस्थ कंप्यूटर पर टच.श कॉपी करें, और चलाएँ ...

cd <DestinationFolder>; sh /tmp/touch.sh

यदि आप चाहते हैं कि उन लोगों को प्रिंट करने के लिए उपयोगकर्ता, समूह का नाम मुद्रित करने के लिए खोज-छाप में विकल्प भी हैं।


क) विचारों के लिए धन्यवाद) "बस एक शेल स्क्रिप्ट का उपयोग करें" और बी) ने कहा कि स्क्रिप्ट का उपयोग कर उत्पन्न करने के लिए find। मैं एक ही स्थिति में था - विशेषताओं, स्रोत और गंतव्य डिस्क को कॉपी करना भूल गया, पहले से ही अलग-अलग मशीनों में थे और वास्तव में इसे उल्टा नहीं करना चाहते थे।
०३६__
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.