কীভাবে আমি "পরিবর্তিত হলে অনুলিপি" অপারেশন করব?


34

আমি ডিরেক্টরিটি A থেকে ডিরেক্টরি বিতে ফাইলগুলির একটি সেট কপি করতে চাই, এই সতর্কতার সাথে যে ডিরেক্টরি A-তে কোনও ফাইল ডিরেক্টরি B এর একটি ফাইলের সমান হয়, সেই ফাইলটি অনুলিপি করা উচিত নয় (এবং সুতরাং এটির পরিবর্তনের সময়টি হওয়া উচিত নয়) আপডেট করা হয়েছে)। এটি করার জন্য আমার নিজের স্ক্রিপ্ট না লিখে বিদ্যমান সরঞ্জামগুলি দিয়ে কী করার কোনও উপায় আছে?

আমার ব্যবহারের ক্ষেত্রে কিছুটা ব্যাখ্যা করার জন্য: আমি .cএকটি অস্থায়ী ডিরেক্টরিতে একটি গুচ্ছ ফাইলগুলি স্বয়ংক্রিয়ভাবে তৈরি করছি (এমন একটি পদ্ধতি যা তাদের সমস্তটি নিঃশর্তভাবে উত্পন্ন করতে হবে), এবং যখন আমি সেগুলি পুনরায় উত্পন্ন করি তখন আমি কেবল অনুলিপি করতে চাই যেগুলি প্রকৃত উত্স ডিরেক্টরিতে পরিবর্তিত হয়েছে এবং অপরিবর্তিত ব্যক্তিদের (তাদের পুরানো সৃষ্টির সময় সহ) রেখে গেছে যাতে makeতারা জানতে পারে যে এগুলি পুনরায় সংকলনের দরকার নেই। ( .cযদিও উত্পন্ন সমস্ত ফাইলই ফাইল নয়, সুতরাং পাঠ্যের তুলনায় আমার বাইনারি তুলনা করা দরকার))

(ক নোট হিসাবে: এই প্রশ্নের আমি জিজ্ঞাসা বাইরে যেতেন https://stackoverflow.com/questions/8981552/speeding-up-file-comparions-with-cmp-on-cygwin/8981762#8981762 , আমি কোথায় চেষ্টা ছিল স্ক্রিপ্ট ফাইলটির গতি বাড়ানোর জন্য আমি এই অপারেশনটি করতে ব্যবহার করেছিলাম, তবে আমার কাছে এটি ঘটে যে আমার নিজের স্ক্রিপ্টটি লেখার চেয়ে এটি করার আরও ভাল উপায় আছে কিনা তা আমার কাছে সত্যিই জিজ্ঞাসা করা উচিত - বিশেষত শেল থেকে এটি করার কোনও সহজ উপায় স্ক্রিপ্ট cmpপ্রতিটি জোড়া ফাইলের মতো কিছু শুরু করবে এবং এই সমস্ত প্রক্রিয়া শুরু করা খুব দীর্ঘ সময় নেয়))


1
diff -qr dirA dirBকোন ফাইলগুলির স্বতন্ত্র dirAএবং dirBঅনন্যরূপে তা দেখতে আপনি ব্যবহার করতে পারেন ।

1
@ ব্রুকস- মোজেস এটি সত্যই ক্যাশে জন্য উপযুক্ত কাজ !
অ্যাকুলিচ

3
@ যদি আপনি অনন্য ফাইলগুলি দেখতে চান তবে আপনি ভিন্ন ব্যবহার করতে পারেন তবে আপনি যদি দেখতে চান তবে কী পরিবর্তন হয়েছে তবে ব্যবহার করুন rsync -avncবা দীর্ঘ পথ rsync --archive --verbose --dry-run --checksum
অ্যাকুলিচ

উত্তর:


29

আরএসসিএনই সম্ভবত এটির জন্য সেরা সরঞ্জাম। এই কমান্ডে অনেকগুলি বিকল্প রয়েছে সুতরাং ম্যান পৃষ্ঠাটি পড়ুন । আমি মনে করি আপনি --checksum বিকল্প বা --ignore বার চান


আমার উল্লেখ করা উচিত ছিল যে আমি ইতিমধ্যে চেষ্টা করেছি, কোনও সাফল্য নেই। এই দুটি অপশনই কেবল আরএসসিএনসি একটি অনুলিপি করে কিনা তা প্রভাবিত করে - তবে, এটি অনুলিপি না করেও, এটি হয় লক্ষ্য ফাইলের পরিবর্তনের সময়টিকে উত্সের মতো ( -tবিকল্পটি নির্দিষ্ট করা থাকলে) বা সিঙ্ক্রোনাইজেশন সময়কে আপডেট করে (যদি -tনির্দিষ্ট না থাকে)
ব্রুকস মুসা

4
@ ব্রুকস মূসা: তা হয় না। অন্তত আমার সংস্করণ rsyncনা। যদি আমি এই কাজ: mkdir src dest; echo a>src/a; rsync -c src/* dest; sleep 5; touch src/a; rsync -c src/* destতারপর, stat dest/aতার র দ্বারা mtime দেখায় এবং ctime 5 বেশী চেয়ে পুরোনো সেকেন্ড হয় src/a
অ্যাঙ্গাস

@angus: হু ঠিক আছে, আপনি ঠিক বলেছেন। কীটি --checksumবিকল্পটি বলে মনে হচ্ছে এবং যদিও linux.die.net/man/1/rsync এ একেবারেই এমন কিছু নেই যা বোঝায় যে এটির পরিবর্তনের তারিখ আপডেট হয়েছে কিনা তার কোনও প্রভাব আছে, তবুও এটি গন্তব্য পরিবর্তনের তারিখটি রেখে দেয় অস্পৃষ্ট। (অন্যদিকে, --ignore-timesবিকল্পটিতে এই প্রভাব নেই; এটির সাথে পরিবর্তনের তারিখটি এখনও আপডেট করা হয়েছে)) এটি সম্পূর্ণরূপে অনির্ধারিত বলে মনে হচ্ছে, যদিও আমি কি এটির উপর নির্ভর করতে পারি?
ব্রুকস মুসা

2
@ ব্রুকস মোজেস: আমি মনে করি আপনি এটির উপর নির্ভর করতে পারেন: rsyncএর কার্যপ্রবাহটি হল: 1) ফাইলটি আপডেট করার দরকার আছে কিনা তা পরীক্ষা করে দেখুন; 2) যদি থাকে তবে ফাইলটি আপডেট করুন। --checksumবিকল্প বলে আপডেট করা উচিত, তাই rsyncধাপ 2 এগিয়ে যাওয়া উচিত নয়)।
enzotib

2
@ ব্রুকসমোস: --ignore-timesছাড়াই --checksumপ্রতিটি ফাইল অনুলিপি করে, এবং সেইসাথে টাইমস্ট্যাম্প আপডেট করে, এমনকি ফাইলগুলি অভিন্ন হলেও।
enzotib

13

আপনি পছন্দ করতে -uসুইচটি ব্যবহার করতে পারেন cp:

$ cp -u [source] [destination]

ম্যান পৃষ্ঠা থেকে:

   -u, --update
       copy only when the SOURCE file is newer than the destination file or 
       when the destination file is missing

4
হাই এবং সাইটে আপনাকে স্বাগতম। আমরা আশা করি উত্তরগুলি এখানে আরও কিছুটা যথেষ্ট হবে। উদাহরণস্বরূপ, -uপতাকাটি কী করে এবং এটি কীভাবে কাজ করে এবং এটি ওপিকে কীভাবে সহায়তা করবে তার একটি ব্যাখ্যা আপনি অন্তর্ভুক্ত করতে পারতেন । তবে, এই বিশেষ ক্ষেত্রে এটি ওপিকে সহায়তা করবে না কারণ এটি অভিন্ন ফাইলগুলি নতুনতর হলে অনুলিপি করে এবং তাই তাদের সময়ের স্ট্যাম্পগুলি পরিবর্তন করে যা ওপিকে এড়াতে চায় তা স্পষ্টভাবে।
টেরডন

1
ইতিমধ্যে মুছে ফেলা একটি অনুরূপ এ সম্পর্কিত একটি মন্তব্য থেকে: "এটি কার্যকর হবে না কারণ এটি উত্সের টাইমস্ট্যাম্পটি নতুন (এবং তাই ওপি অনুরোধের বিপরীতে গন্তব্যের টাইমস্ট্যাম্প আপডেট করুন)"
slm

প্রশ্নের মোটেও উত্তর দেয় না, তবে আমি এটি দরকারী বলে মনে করি।
ব্যবহারকারীর 131389

7

ব্যবহারের সময় rsync --checksum"পরিবর্তিত হলে অনুলিপি করার" একটি ভাল সাধারণ উপায়, আপনার বিশেষ ক্ষেত্রে আরও একটি ভাল সমাধান আছে!

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

পরবর্তী আমি নিশ্চিত আপনি জিজ্ঞাসা করবেন, "এটি নিরাপদ?" ওয়েল, হ্যাঁ, ওয়েবসাইটটি যেমন উল্লেখ করেছে:

এটি নিরাপদ?

হ্যাঁ। সংকলক ক্যাশের সর্বাধিক গুরুত্বপূর্ণ দিকটি হ'ল সর্বদা একই আউটপুট উত্পাদন করা যা আসল সংকলক উত্পাদন করে। এর মধ্যে হুবহু একই অবজেক্ট ফাইল সরবরাহ করা এবং ঠিক একই সংকলক সতর্কতাগুলি সরবরাহ করা রয়েছে যা আপনি যদি সত্যিকারের সংকলক ব্যবহার করেন তবে উত্পাদিত হবে। আপনি যে ক্যাশে ব্যবহার করছেন তা কেবলমাত্র তা বলতে পারা উচিত speed

এবং এটি আপনার মেকফিলের লাইনে কেবল একটি উপসর্গ হিসাবে যুক্ত করে এটি ব্যবহার করা সহজCC= (বা আপনি সিমলিংকগুলি ব্যবহার করতে পারেন তবে মেকফিলের উপায়টি সম্ভবত আরও ভাল)।


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

না, আমি আপনাকে পরামর্শ দিচ্ছিলাম না যে আপনি সমস্ত ফাইল অনুলিপি করুন, বরং আপনি কেবল নিজের .c ফাইলগুলিকে স্থানে স্বয়ংক্রিয়ভাবে তৈরি করতে পারেন (অনুলিপি পদক্ষেপটি সরান এবং সরাসরি তাদের কাছে লিখুন)। এবং তারপরে কেবল ccache ব্যবহার করুন। আমি শত শত সিসি প্রক্রিয়া শুরু করে কী বলতে চাইছি তা আমি জানি না ... এটি জিসিসির চারপাশে একটি হালকা ওজনের মোড়ক যা খুব দ্রুত এবং এটি আপনার প্রকল্পের অন্যান্য অংশগুলিকেও পুনর্নির্মাণের গতি বাড়িয়ে তুলবে। আপনি এটি ব্যবহার করার চেষ্টা করেছেন? আমি আপনার অনুলিপি-পদ্ধতি বনাম ccache ব্যবহারের মধ্যে সময়ের তুলনা দেখতে চাই। আপনি উভয় সুবিধা পেতে দুটি পদ্ধতি একত্রিত করতে পারেন।
অ্যাকুলিচ

1
ঠিক আছে, ঠিক আছে, আমি এখন অনুলিপি সম্পর্কে বুঝতে পারি। স্পষ্ট করার জন্য, আমার অর্থটি হ'ল: আমি যদি ফাইলগুলি স্থানে উত্পন্ন করি তবে আমাকে ccache file.c -o file.oকয়েকবার বার কল করতে হবে বা সমতুল্য হতে হবে কারণ কয়েকশো file.cফাইল রয়েছে। আমি যখন এটির cmpপরিবর্তে করছিলাম , তার চেয়ে ccacheবেশ কয়েক মিনিট সময় নিয়েছিল - এবং cmpতত হালকা ccache। সমস্যাটি হ'ল সাইগউইন-তে, একটি প্রক্রিয়া শুরু করতে অ-তুচ্ছ সময় লাগে, এমনকি সম্পূর্ণ তুচ্ছ প্রক্রিয়াটির জন্য।
ব্রুকস মূসা

1
ডেটাপয়েন্ট হিসাবে, for f in src/*; do /bin/true.exe; done30 সেকেন্ড সময় লাগে তাই হ্যাঁ। যাইহোক, আমি আমার উইন্ডোজ-ভিত্তিক সম্পাদককে অগ্রাধিকার দিচ্ছি এবং টাইমিংয়ের এই ধরণের সমস্যাটি বাদ দিয়ে সাইগউইন আমার ওয়ার্কফ্লোতে লাইটওয়েটের জায়গা হিসাবে স্থানীয়ভাবে জিনিসগুলি পরীক্ষা করার জন্য হালকা জায়গা হিসাবে কাজ করে যদি আমি বিল্ড সার্ভারগুলিতে আপলোড না করি। আমার শেল এবং আমার সম্পাদক একই OS এ থাকা কার্যকর It's :)
ব্রুকস মূসা

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

3

এটি আপনার যা প্রয়োজন তা করা উচিত

diff -qr ./x ./y | awk '{print $2}' | xargs -n1 -J% cp % ./y/

কোথায়:

  • এক্স আপনার আপডেটড / নতুন ফোল্ডার
  • y হ'ল গন্তব্য আপনি অনুলিপি করতে চান
  • ডাব্লু আলাদা আলাদা কমান্ড থেকে প্রতিটি লাইনের দ্বিতীয় আর্গুমেন্ট গ্রহণ করবে (সম্ভবত স্থানের সাথে ফাইলের নামগুলির জন্য আপনার অতিরিক্ত কিছু জিনিস লাগবে - এটি এখন চেষ্টা করতে পারবেন না)
  • xargs -J% ফাইলের নামটি সিপিতে যথাযথ স্থানে প্রবেশ করবে

1
-1 কারণ এটি অত্যধিক জটিল, অ-বহনযোগ্য ( -Jবিএসডি-নির্দিষ্ট; এটি জিএনইউ xargs এর সাথে -I), এবং যদি ঠিক একইভাবে ফাইলগুলির উভয় স্থানে উপস্থিত না থাকে (যদি আমি touch x/booতখন গ্রিপ আমাকে দেয়) Only in ./x: booযা পাইপলাইনে ত্রুটি সৃষ্টি করে)। একটি টুল কাজের জন্য নির্মিত ব্যবহার করুন, মত rsync --checksum
অ্যাকুলিচ

বা আরও ভাল, এই নির্দিষ্ট ক্ষেত্রে ccache ব্যবহার করুন
অ্যাকুলিচ

+1 কারণ এটি একই সাথে পরিচিত কমান্ডগুলির একটি সেট যা আমি একই ধরণের কাজগুলিতে ব্যবহার করতে বিরতি করতে পারি (এটি একটি ভিন্ন করার জন্য এখানে এসেছি), তবে এই বিশেষ কাজের জন্য
আরএসসিএন

3

আমি এর পক্ষে একযোগ ব্যবহার করতে চাই rsyncকারণ এটি ইতিমধ্যে আমার এসএস কীগুলি সেটআপ করে এবং পৃথকভাবে ভিপিএন রেখে একাধিক মাস্টারকে সমর্থন করে

সুতরাং আমার একমাত্র হোস্টের ক্রোনট্যাবে আমি তাদের প্রতি 15 মিনিটে সিঙ্ক্রোনাইজ করতে দিয়েছি:

* / 15 * * * * [-z "$ (পিডোফ ইউনিজেন্সি)"] && (সময়সীমা 25 মিটার একত্রীকরণ -সোর্টবাইজাইজ -উই পাঠ্য -বাচ-সময় / হোম / মাস্টার এসএসএস: //192.168.1.12//home/master -path dev -logfile /tmp/sync.master.dev.log) &> /tmp/sync.master.dev.log

তারপরে আমি উভয় দিকে বিকাশ করতে পারি এবং পরিবর্তনগুলি প্রচার করবে। প্রকৃতপক্ষে গুরুত্বপূর্ণ প্রকল্পগুলির জন্য আমার কাছে একই গাছের আয়নাঙ্কিত 4 ​​টি পর্যন্ত সার্ভার রয়েছে (ক্রোন থেকে 3 টি একযোগে চালানো হয়, যা না তা নির্দেশ করে)। প্রকৃতপক্ষে, লিনাক্স এবং সাইগউইন মিশ্রিত - সাইগউইন পরিবেশের বাইরে উইন 32-এ নরম লিঙ্কগুলির বাইরে জ্ঞানের আশা করবেন না।

আপনি যদি এই রুটে যান, খালি দিকে প্রাথমিক আয়নাটি তৈরি করুন -batch, মানে ছাড়াই

unison -ui text  -times /home/master ssh://192.168.1.12//home/master -path dev

অবশ্যই ব্যাকআপ ফাইল, সংরক্ষণাগার, ইত্যাদি উপেক্ষা করার জন্য একটি কনফিগারেশন রয়েছে:

 ~/.unison/default.prf :
# Unison preferences file
ignore = Name {,.}*{.sh~}
ignore = Name {,.}*{.rb~}
ignore = Name {,.}*{.bak}
ignore = Name {,.}*{.tmp}
ignore = Name {,.}*{.txt~}
ignore = Name {,.}*{.pl~}
ignore = Name {.unison.}*
ignore = Name {,.}*{.zip}

    # Use this command for displaying diffs
    diff = diff -y -W 79 --suppress-common-lines

    ignore = Name *~
    ignore = Name .*~
    ignore = Path */pilot/backup/Archive_*
    ignore = Name *.o

আমি এটি দেখেছি, কিন্তু আমি এমন কোনও unisonবিকল্প খুঁজে পাইনি যার অর্থ "ফাইল-সর্বশেষ-পরিবর্তিত তারিখগুলি আপডেট করবেন না"। একটি আছে? অন্যথায়, এটি সম্পূর্ণ ভিন্ন সমস্যার দুর্দান্ত উত্তর।
ব্রুকস মুসা

1
-timesআমার জন্য যে না। ইউনিসন একটি শুকনো রান মোড আছে, আমি মনে করি।
মার্কোস

ঠিক আছে, সেটিংস times=false(বা ছেড়ে চলে যাওয়া -times) তা করবে। আমি জানি না যে আমি কীভাবে এটি আগে নথিভুক্তিতে মিস করেছি। ধন্যবাদ!
ব্রুকস মূসা

সাহায্য করে আনন্দ পেলাম. মোডটাইমস, অনুমতি এবং সফট লিঙ্কগুলির মতো জিনিস সংরক্ষণের ক্ষেত্রে যখন আমি স্টিকলার হই। প্রায়শই উপেক্ষা করা হয়
মার্কোস

1

rsync --checksumসঠিক উত্তরটি থাকাকালীন , নোট করুন যে এই বিকল্পটিটির সাথে সামঞ্জস্যপূর্ণ নয় --timesএবং এর --archiveঅন্তর্ভুক্ত রয়েছে --times, সুতরাং আপনি যদি চান rsync -a --checksum, আপনার সত্যই প্রয়োজন rsync -a --no-times --checksum


'বেমানান' বলার অর্থ কী?
ওভ

"সঠিক উত্তর" বলতে কী বোঝ?
thoni56
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.