ফাইলগুলি সিঙ্ক করার সর্বোত্তম উপায় - কেবলমাত্র বিদ্যমান ফাইলগুলি অনুলিপি করুন এবং কেবলমাত্র লক্ষ্যমাত্রার চেয়ে নতুন


18

আমি উবুন্টু 12.04 এ স্থানীয়ভাবে এই সিঙ্কটি করছি। ফাইলগুলি সাধারণত ছোট টেক্সট ফাইল (কোড) হয়।

আমি sourceডিরেক্টরি থেকে ক্রেডিট করতে চাই (এমটাইম স্ট্যাম্প সংরক্ষণ করে) targetতবে আমি কেবল তখনই অনুলিপি করতে চাই যদি ফাইলটি target ইতিমধ্যে বিদ্যমান থাকে এবং ফাইলটি তার চেয়ে পুরনো হয় source

সুতরাং আমি কেবল নতুন ফাইলগুলিতে অনুলিপি করছি sourceতবে সেগুলি অবশ্যই উপস্থিত targetথাকবে বা সেগুলি অনুলিপি করা হবে না। (এর sourceচেয়ে আরও অনেকগুলি ফাইল থাকবে target))

আমি আসলে sourceএকাধিক targetডিরেক্টরি থেকে অনুলিপি করা হবে । সমাধানের পছন্দকে প্রভাবিত করার ক্ষেত্রে আমি এটি উল্লেখ করছি। যাইহোক, আমি সহজেই আমার কমান্ডটি একাধিকবার চালাতে পারি, targetপ্রতিটি সময় নতুন নির্দিষ্ট করে , যদি এটি প্রয়োজন হয় তবে।

উত্তর:


29

আমি বিশ্বাস করি আপনি এটি করতে ব্যবহার করতে পারেন rsync। মূল পর্যবেক্ষণটি --existing--updateসুইচগুলি ব্যবহার করা প্রয়োজন ।

        --existing              skip creating new files on receiver
        -u, --update            skip files that are newer on the receiver

এটির মতো একটি আদেশ এটি করবে:

$ rsync -avz --update --existing src/ dst

উদাহরণ

বলুন যে আমাদের নীচের নমুনা ডেটা আছে।

$ mkdir -p src/; touch src/file{1..3}
$ mkdir -p dst/; touch dst/file{2..3}
$ touch -d 20120101 src/file2

যা দেখতে নিম্নলিখিত:

$ ls -l src/ dst/
dst/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

src/:
total 0
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file1
-rw-rw-r--. 1 saml saml 0 Jan  1  2012 file2
-rw-rw-r--. 1 saml saml 0 Feb 27 01:00 file3

এখন আমি যদি এই ডিরেক্টরিগুলি সিঙ্ক করতে পারি তবে কিছুই হবে না:

$ rsync -avz --update --existing src/ dst
sending incremental file list

sent 12 bytes  received 31 bytes  406.00 bytes/sec
total size is 0  speedup is 0.00

যদি আমাদের touchউত্স ফাইল থাকে যাতে এটি আরও নতুন হয়:

$ touch src/file3 
$ ls -l src/file3
-rw-rw-r--. 1 saml saml 0 Feb 27 01:04 src/file3

rsyncকমান্ডের আর একটি রান :

$ rsync -avz --update --existing src/ dst
sending incremental file list
file3

sent 115 bytes  received 31 bytes  292.00 bytes/sec
total size is 0  speedup is 0.00

আমরা এটি দেখতে পাচ্ছি file3, যেহেতু এটি আরও নতুন, এবং এটি বিদ্যমান রয়েছে dst/, এটি প্রেরণ হয়ে যায়।

পরীক্ষামূলক

কমান্ডটি শিথিল করার আগে জিনিসগুলি কাজ করছে তা নিশ্চিত করার জন্য, আমি অন্য কোনও rsyncসুইচ ব্যবহার করার পরামর্শ দিই --dry-run,। এর অন্য একটি যোগ করুন -vখুব তাই rsyncএর আউটপুট আরো বাগাড়ম্বরপূর্ণ হয়।

$ rsync -avvz --dry-run --update --existing src/ dst 
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
file1
file2 is uptodate
file3 is newer
total: matches=0  hash_hits=0  false_alarms=0 data=0

sent 88 bytes  received 21 bytes  218.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

ধন্যবাদ. আমার আর কিছু আরএসসিএনসি বিকল্পের দরকার নেই? আমি ম্যান পেজ পড়ছি। মত আমি এই প্রয়োজন হতে পারে বলে মনে হয়: rsync --archive --update --existing --whole-file --itemize-changes a/ b। বা এই বিকল্পগুলির বেশিরভাগই অপ্রয়োজনীয়? (আমি পুরো ফাইলটি যুক্ত করেছি কারণ এগুলি বেশিরভাগ ছোট টেক্সট ফাইল))
মোনিকা সেলিওর

@ মাউন্টেনএক্স - আপনার প্রয়োজনীয় বিকল্পগুলি যুক্ত করুন। আমি -aএটি সুইচ একটি সুপারস্টেট দিয়ে শুরু করব -rlptgoD,।
slm

আমি এটা স্পষ্ট করা যাক। আমি --updateএবং সম্পর্কে বিভ্রান্ত --existing। আমার কি দু'জনের দরকার? আমি আপনার সমাধানটি পরীক্ষা করেছি এবং এটি কার্যকর হবে বলে মনে হচ্ছে, তবে আমি এখনও যুক্ত করা আরও নিরাপদ বোধ করি --update
মনিকা সেলিওর জন্য মাউন্টেনএক্স

@ মাউন্টেনএক্স - আপনি এটি যুক্ত করতে পারবেন তা নিশ্চিত করে আমি এটি এ তেও রেখে দেব।
slm
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.