কীভাবে ফাইলের প্রকৃত বিষয়বস্তু ছাড়াই কেবল ফাইল বৈশিষ্ট্য (মেটাডেটা) অনুলিপি করবেন?


21

আমি এর সাথে ফাইলগুলির টেরাবাইটগুলি অনুলিপি করেছি rsyncতবে আমি --archiveফাইলগুলির বিশেষ বৈশিষ্ট্যগুলি সংরক্ষণ করতে ব্যবহার করতে ভুলে গিয়েছি ।

আমি এবার rsyncসাথে সাথে মৃত্যুদণ্ড কার্যকর করার চেষ্টা করেছি --archiveতবে এটি আমার প্রত্যাশার চেয়ে ধীর ছিল। কেবল পুনরাবৃত্তভাবে মেটাডেটা অনুলিপি করে দ্রুত করার কোনও সহজ উপায় আছে কি?


"মেটাডেটা" দিয়ে আপনি বোঝাচ্ছেন ফাইল অনুমতি এবং ফাইলের মালিকানা বা বর্ধিত ফাইল বৈশিষ্ট্যের মতো আরও জটিল জিনিস?
মার্সেল স্টিমবার্গ

যে ফাইল সিস্টেমে সোর্স ফাইলগুলি থাকে সেগুলি স্থানীয়ভাবে মাউন্ট করা যায় কি না?
enzotib

মেটাডাটা দ্বারা আমি অনুমতি এবং সময় স্ট্যাম্পগুলি বোঝায়। টাইম স্ট্যাম্পগুলি আমার জন্য বিশেষত গুরুত্বপূর্ণ।
মোহাম্মদ

উত্স এবং গন্তব্য উভয়ই ফাইল সিস্টেম স্থানীয়ভাবে মাউন্ট করা হয়।
মোহাম্মদ

উত্তর:


17

ঠিক আছে, আপনি ব্যবহার মালিক, গ্রুপ, অনুমতি এবং টাইমস্ট্যাম্প অনুলিপি করতে পারেন --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
হ্যাঁ, এটাই আমার দরকার: - chmod এ রেফারেন্স। ধন্যবাদ. যদি কেউ টাইম-স্ট্যাম্পগুলি অনুলিপি করার জন্য chmod - রেফারেন্সের মতো কিছু উপস্থাপন করতে পারে তবে আমি সত্যিই এটির প্রশংসা করি।
মোহাম্মদ

1
@ মোহাম্মদ: এর জন্য আপনি ব্যবহার করতে পারেন touch --reference=otherfile file। উত্তর আপডেট করেছেন
এনজোটিব

দারুণ. আসলে আমি এখনই টাচ ম্যানুয়ালটি পড়ছিলাম ;-)
মোহাম্মদ

কেবল একটি নোট: touchডিজাইন দ্বারা কেবল পরিবর্তন এবং অ্যাক্সেসের সময়গুলি পরিবর্তিত হয়, "সৃষ্টি" সময় প্রভাবিত হয় না। (আমি মনে করি ext2 / 3 যাইহোক সিটিটাইম পরিবর্তন সমর্থন করে না, তবে আপনি এনটিএফএস বা এর মতো ব্যবহার করছেন কিনা তা বিবেচনা করতে পারে)।
আম্রো

আপনি যদি কেবল বিদ্যমান ফাইলগুলির মেটাডেটা পরিবর্তন করতে চান এবং ফাইলগুলির অস্তিত্বের নিশ্চয়তা দেওয়ার প্রয়োজন না হয়, এটিতে খালি ফাইল তৈরি বন্ধ করতে কমান্ডটিতে একটি -cস্যুইচ যুক্ত touchকরুন $dst_path
সিঙ্ক্রো

5

সতর্কতা: বিশেষ কাজের ব্যতীত, জিএনইউ cp --attributes-onlyগন্তব্য ফাইলগুলি কমপক্ষে নির্ভুলভাবে কাটাবে। নীচে সম্পাদনা দেখুন।

মূল:

এই পরিস্থিতিতে আপনি সম্ভবত জিএনইউ সিপি-র --attributes-onlyবিকল্প চান, --archiveএটি চেষ্টা ও পরীক্ষিত কোড হিসাবে , একসাথে সমস্ত ফাইল-সিস্টেম-অজ্ঞানতিক বৈশিষ্ট্যগুলি করে এবং সিমলিংকগুলি অনুসরণ করে না (সেগুলি অনুসরণ করা খারাপ হতে পারে!):

cp --archive --attributes-only /source/of/failed/backup/. /destination/

ফাইল হিসাবে, cpবর্ধিত বৈশিষ্ট্যাবলী সঙ্গে যুত: যদি উভয় উত্স এবং গন্তব্য বর্ধিত বৈশিষ্ট্যাবলী আছে এটা যোগ উৎস এর বর্ধিত বৈশিষ্ট্যাবলী গন্তব্যে (বরং গন্তব্য এর xattrs সব প্রথম মোছার চেয়ে)। cpআপনি যদি একটি বিদ্যমান গাছের মধ্যে ফাইলগুলি অনুলিপি করেন তবে এটি কীভাবে আচরণ করে তা মিরর করে rors

এছাড়াও মনে রাখবেন যে আপনি যদি প্রথমবারের মতো হার্ড লিঙ্কগুলি সংরক্ষণ না করে rsyncতবে এখনই সংরক্ষণ করতে চান তবে আপনার পক্ষে এটি ঠিক করা cp হবে না ; আপনি সম্ভবত rsyncসঠিক বিকল্পগুলি (আমার অন্য উত্তর দেখুন ) এবং ধৈর্যশীল হয়ে পুনরায় কাজ করা সেরা।

আপনি যদি ইচ্ছাকৃতভাবে পৃথক এবং মেটাডেটা / ফাইল সামগ্রীগুলি পুনরায় সমন্বিত করতে গিয়ে এই প্রশ্নটি খুঁজে পেয়ে থাকেন তবে আপনি উবুন্টু সংগ্রহস্থলে থাকা মেটাস্টোরটি একবার দেখে নিতে পারেন ।

উত্স: জিএনইউ কোর্টিল ম্যানুয়াল


যুক্ত করতে সম্পাদিত:

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

একটি দ্রুত পরীক্ষা এটিকে মুছে ফেলা বলে মনে হচ্ছে এটি কাজ করে, তাই আমি অনুমান করি যে আমি মূলটিতে একটি অতিরিক্ত বা অতিরিক্ত কাজ / ভুলকে স্থির করেছিলাম তবে এখনই যেহেতু প্রত্যেকেই নতুন নতুন কর্টিলগুলিতে থাকবে on
জাকডাব্লু

তবে আপনি rsyncযা সঠিক বিকল্পগুলির সাথে কল করেছেন তা হ'ল অন্য প্রশ্নের উত্তর ...
জিন পল

5

"আরএসসিএনসি'র অনুলিপি করার জন্য কেবল মেটাডেটা হিসাবে প্রশ্নটি চিকিত্সা করা হচ্ছে, তবে এটি এত ধীর কেন, এবং আমি কীভাবে এটি আরও দ্রুত করতে পারি?":

rsyncঅপরিবর্তিত ফাইলগুলি সনাক্ত করতে এবং এড়াতে সাধারণত হিউরিস্টিক হিসাবে সমান টাইমস ব্যবহার করে। উত্স ফাইলগুলির সময়কাল অটুট থাকে (আপনার দ্বারা ম্যানুয়াল ট্রিক্রিটি উপেক্ষা করে) গন্তব্য ফাইলগুলির সময়সীমাগুলি আপনি আরএসসি-সম্পাদনার সময় সেট করে না রেখে --archive(বিশেষতঃ ছাড়া --times) Without আপনার কাছ থেকে বাহ্যিক গ্যারান্টি ছাড়াই যে উত্স ফাইলগুলির বিষয়বস্তু পরিবর্তিত হয়নি, আরএসসিএনকে ধরে নিতে পারে তাদের থাকতে পারে এবং তাই তাদের চেকসাম করতে হবে এবং / অথবা তাদের আবার গন্তব্যে অনুলিপি করতে হবে। এই, প্লাস সত্য যে --whole-filelocal-> স্থানীয় সিঙ্ক জন্য উহ্য হয়, তোলে rsyncছাড়া --timesপ্রায় সমতুল্য cpস্থানীয় সিঙ্ক জন্য।

শর্তযুক্ত যে গন্তব্য ফাইলগুলির বিষয়বস্তু আপডেট করা গ্রহণযোগ্য, বা যদি উত্স ফাইলগুলি অনুলিপিটি মূল অনুলিপি থেকে পাওয়া যায় তবে আপনার rsync --archive --size-onlyএকটি নিষ্পাপ আরএসসিএনসি এর চেয়ে দ্রুত খুঁজে পাওয়া উচিত ।

rsyncএতক্ষণ যে অনুলিপি নিচ্ছে তা নিয়ে যদি সন্দেহ হয় , rsync --archive --dry-run --itemize-changes ...সম্পূর্ণরূপে বিশদভাবে বললে।


1
খুব দরকারী তথ্য। --আরচাইভ - সাইজ-ওয়ানল একটি দুর্দান্ত কম্বো। এটি কেবল গন্তব্যটিতে বিদ্যমান ফাইলগুলি পুনরায় কপি করা প্রতিরোধ করে না, তবে এটি তাদের মেটাডেটাও আপডেট করবে। এটি আমার জন্য অপ্রত্যাশিত ছিল, কারণ আরএসইএনসি'র ম্যান পৃষ্ঠাটি সাইজ-কেবলমাত্র "স্কিপিং" ফাইল হিসাবে বর্ণনা করে যার আকারের সাথে মেলে। দেখা যাচ্ছে যে এটি কেবল অনুলিপিটি এড়িয়ে চলেছে তবে তবুও মেটাডেটা সিঙ্ক করবে। আদর্শ।
চাদ ভন নউ

2

স্থানীয় স্থানান্তরগুলিতে, যখন উত্স এবং গন্তব্য স্থানীয়ভাবে মাউন্ট করা ফাইল সিস্টেমে থাকে, rsyncসর্বদা সম্পূর্ণ ফাইলের সামগ্রীটি অনুলিপি করে। এটি এড়াতে আপনি ব্যবহার করতে পারেন

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

আমি --no-পুরো-ফাইল এবং --progress এর সাথে আরএসআইএনসি চেষ্টা করেছি এবং আমি অনুলিপি অগ্রগতিটি দেখতে পাচ্ছি (প্রায় 30 এমবি / গুলি); সুতরাং আমি অনুমান করি যে এটি এখনও যথেষ্ট দ্রুত নয়। আমি আমার আশা হারিয়ে ফেলছি আরএসসিএনসি তে ...
মোহাম্মদ

এই বিকল্পটি rsyncফাইল দুটি স্থানীয় পথে থাকলে শর্টকাটটি ব্যবহার না করার জন্য ব্যবহার করা হয়, তবে এটি rsyncসামগ্রী অনুলিপি করা থেকে বিরত থাকে না ।
জিন পল

2

আমাকে অন্য কম্পিউটারে দূর থেকে এটি করতে হয়েছিল যাতে আমি - উল্লেখ ব্যবহার করতে না পারি

আমি স্ক্রিপ্টটি তৈরি করতে এটি ব্যবহার করেছি ...

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

তবে নিশ্চিত করুন যে "এর মধ্যে কোনও ফাইলের নাম নেই ..."

find | grep '"'

তারপরে আপনার দূরবর্তী কম্পিউটারে স্পর্শ.শ অনুলিপি করুন এবং চালনা করুন ...

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

ব্যবহারকারীদের মুদ্রণের জন্য -প্রিন্টফের বিকল্পগুলি রয়েছে, আপনি যদি সেগুলি অনুলিপি করতে চান তবে গ্রুপের নাম।


ক) এই ধারণাগুলির জন্য ধন্যবাদ) "কেবলমাত্র একটি শেল স্ক্রিপ্ট ব্যবহার করুন" এবং খ) উক্ত স্ক্রিপ্টটি ব্যবহার করে উত্পন্ন করতে find। আমি একই পরিস্থিতিতে ছিলাম - বৈশিষ্ট্যগুলি অনুলিপি করতে ভুলে গেছি, উত্স এবং গন্তব্য ডিস্কগুলি ইতিমধ্যে বিভিন্ন মেশিনে ছিল এবং সত্যিই সেটিকে বিপরীত করতে চায় না ।
i336_
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.