ওএস এক্সে সাবভারশন ফাইল এবং ফোল্ডারগুলি বাদ দিয়ে সমস্ত ফাইল এবং ফোল্ডার অনুলিপি করুন


14

আমি সমস্ত ফাইল এবং ফোল্ডারগুলি একটি ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে অনুলিপি করার চেষ্টা করছি, তবে নির্দিষ্ট ফাইলগুলি বাদ দিন। বিশেষত, আমি সাবভারশন ফাইল এবং ফোল্ডারগুলি বাদ দিতে চাই। তবে, আমি একটি সাধারণ কিন্তু সংক্ষিপ্ত সমাধান চাই।

আমি ভাবছি আমি অদূর ভবিষ্যতে বেশ কয়েকটি ধরণের ফাইল বাদ দেওয়ার প্রয়োজনীয়তা খুঁজে পাব। উদাহরণস্বরূপ, আমি .svn, * .bak এবং * .prj বাদ দিতে চাই।

এখানে আমি একসাথে যা রেখেছি তা এখানে রয়েছে তবে এটি আমার পক্ষে কার্যকর নয়। প্রথম অংশটি, কাজগুলি সন্ধান করুন, তবে আমি xargs এবং সিপি দিয়ে কিছু ভুল করছি । আমি সাথে এবং ছাড়া সিপি চেষ্টা করেছিলাম -R। এছাড়াও, আমি ওএস এক্স ব্যবহার করছি এবং এটি লিনাক্স সিস্টেমের তুলনায় xargs এর কম বৈশিষ্ট্যযুক্ত সংস্করণ বলে মনে হচ্ছে ।

find ./sourcedirectory -not \( -name .svn -a -prune \)
     | xargs -IFILES cp -R FILES ./destinationdirectory

আমি ভুল হতে পারি, তবে আমি মনে করি এটি আপনার কথায় কৃপণ। এমনকি যদি আপনার findকমান্ড সঠিকভাবে ব্যবহার -pruneআইটেম .svn অগ্রাহ্য করা হবে তারপর আপনি পাস -Rপতাকা cpযা বলে যে কমান্ড রিকার্সিভ যাবে। এটি যখন হয়ে যায়, আপনি findকমান্ডটিতে যা কিছু গ্রানুলারিটি হারিয়েছিলেন তা হারাবেন । আমি এক মিনিটের জন্য Tinker যাচ্ছি এই সঙ্গে, কিন্তু আমি মনে করি উত্তর হল না ব্যবহার -Rমধ্যে cpকমান্ড।
টেলিমাচাস

মনে হচ্ছে এটি আমার জন্য একটি লিনাক্স সিস্টেমে কাজ করে। "এটি কাজ করছে না" এর অর্থ কী আপনি আরও সুনির্দিষ্ট হতে পারেন? কোন ত্রুটি বার্তা? ফাইলগুলি প্রত্যাশা করছেন এমন অনুলিপি পাওয়া যাচ্ছে না?
পরবর্তী বিজ্ঞপ্তি না দেওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

এটি -Rপতাকা, আমি নিশ্চিত। এটি সরান এবং আপনার ভাল হওয়া উচিত (যদিও আপনি -mindepth 1টপলেভাল ডিরেক্টরি ফোল্ডারটি অনুলিপি করতে চান যা আপনি অনুলিপি করতে চান না), আমি ধরে নিই)
টেলিম্যাচস

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

উত্তর:


22

(প্রশ্নটি পুনরায় পড়ার পরে সম্পাদিত Question প্রশ্নকর্তা বলেছেন, আরএসসিএন ইনস্টল করা নেই)

আপনার সন্ধান / xargs সমাধানের একটি সম্ভাব্য সমস্যা হ'ল ফাইল নামগুলির ফাঁকা স্থান। এটি পেতে, সন্ধান করুন এবং খুঁজে পাওয়া ফাইলগুলি পৃথক করতে একটি নাল অক্ষর (ASCII 0) ব্যবহার করার জন্য xargs:

find ./sourcedirectory -not ( -name .svn -a -prune ) -print0 | xargs -0 -IFILES cp FILES ./destinationdirectory

আপনি যদি দেখতে পান যে আরএসআইএনসি পাওয়া যায় তবে আমি এখনও মনে করি যে আরএসইএনসিই এর থেকে আরও ভাল সমাধান:

-সি বিকল্পের সাথে rsync ব্যবহার করুন। থেকে rsync man পৃষ্ঠা :

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

এটি rsync কে এই নিদর্শনগুলি উপেক্ষা করতে বলবে:

RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state .nse_depinfo *~
#* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej .del-* *.a *.olb *.o *.obj 
*.so *.exe *.Z *.elc *.ln core .svn/ .git/ .bzr/

উদাহরণ স্বরূপ:

rsync -avC /path/to/source/directory /path/to/destination/directory

(দ্রষ্টব্য: আপনি যদি এখন পর্যন্ত আরএসআইএনসি-র সাথে খুব বেশি পরিচিত না হন, তবে অবশ্যই সেই ম্যান পেজে পড়তে ভুলবেন না যে কীভাবে সোর্স পাথে ট্র্যাকিং স্ল্যাশের সাথে আরএসএনসি কীভাবে আচরণ করে। আপনি যদি না করেন তবে স্ল্যাশটি অন্তর্ভুক্ত করা হলে এটি অন্যরকম আচরণ করে। 'ট্রেলিং স্ল্যাশ' অনুসন্ধান করুন)


ওহ ইঁদুর, আমি কেবল আপনার প্রশ্নটি পুনরায় পড়েছি এবং দেখেছি আপনি বলেছিলেন যে আপনি আরএসসিএন ইনস্টল করেন নি। আমার ম্যাকবুক প্রোতে (ওএস এক্স 10.6.1) এটি / ইউএসআর / বিন / আরএসএনসি-তে রয়েছে। এটি আমার জন্য টাইগার (10.4) এবং চিতা (10.5) এর অধীনে ইনস্টল করা হয়েছিল।
ডগ হ্যারিস

আমি নিশ্চিত যে আপনি (এবং ওপি) কমান্ডের অংশে -Rপতাকাটি চান না pretty xargs
টেলিমাচাস

ভাল ধরা, আমি মূল প্রশ্নটি থেকে অনুলিপি করেছি। এখনই সম্পাদনা করবে।
ডগ হ্যারিস

1
ধন্যবাদ ডগ! একটি জিনিস আমি প্রচার করি, "কাজের জন্য সঠিক সরঞ্জামটি ব্যবহার করুন"। আমি সম্প্রতি উইন্ডোজ ওয়ার্ল্ড থেকে ওএসএক্স এ এসেছি এবং এখনও অজ্ঞতায় ভুগছি। আমি এই একই প্রশ্নটি একটি লিনাক্স চ্যানেলে পোস্ট করেছি এবং কেউ দ্রুত বলেছে, কেবল "rsynch" ব্যবহার করে আমি টার্মিনালে "rsynch" টাইপ করেছি এবং দেখেছি এটি বিদ্যমান নেই এবং অনুসন্ধান তদন্ত চালিয়ে যেতে | xargs পদ্ধতির। আমি এরকম কিছুটা অনড়। যাইহোক, ওএসএক্সের ডিফল্টরূপে "rsync" রয়েছে এবং আপনার পোস্টটি খুব সহায়ক ছিল। কোনটি ভাল তা জানার জন্য আমার কাছে এখনও পর্যাপ্ত অভিজ্ঞতা নেই তবে আরএসসিএনসি নিশ্চিত যে আরও বেশি সংক্ষিপ্ত। ধন্যবাদ!
মাইকেল প্রেসকোট

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

2

সাধারণ সমাধান নয় তবে ... আপনি .svn মেটাডেটা ফোল্ডারগুলি ছাড়াই ওয়ার্কস্পেসের অনুলিপি তৈরি করতে svn এক্সপোর্ট কমান্ডটি ব্যবহার করতে পারেন।


আপত্তিকর হওয়ার জন্য নয়, তবে কেন এই উত্তরটি ভোটে উঠছে তা আমি নিশ্চিত নই। আমি এসএনএন এর ক্ষমতা সম্পর্কে সচেতন, তবে "আমি একটি সাধারণ তবুও সংক্ষিপ্ত সমাধান চাই I আমি ধারণা করি যে অদূর ভবিষ্যতে আমি বেশ কয়েকটি ধরণের ফাইল বাদ দেওয়ার প্রয়োজনীয়তা খুঁজে পাব"
মাইকেল প্রেসকোট

2
%> mkdir -p FOLDER_OUT && ( tar cf - FOLDER_OR_FILES_IN --exclude=.svn  | tar xvf - -C FOLDER_OUT )

আপনি যদি চান তবে এমনকি 2 টির প্রসেসের মধ্যে 'পিভি' বা অনুরূপ কিছু রাখতে পারেন।


2

একটি নোংরা কিন্তু দ্রুত এবং সংক্ষিপ্ত উপায়:

cp -r source destination
find destination -iname .svn |xargs rm -rf

এটি একটি ডিরেক্টরিকে অন্যটিতে অনুলিপি করে (সুতরাং পুনরাবৃত্তির বিকল্পটি -r) এবং তারপরে পুনরাবৃত্তভাবে যেকোন কিছু মুছা যায় .svn(কেস উপেক্ষা করে)।


1

আমি ডার এবং এর বাদ দেওয়ার প্রক্রিয়াটি ব্যবহার করে এটিকে অন্যভাবে চলতে চাই।

গন্তব্য ডিরেক্টরি থেকে:

tar -X excludefile -C source -f - . | tar xf -

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


সত্যিই মার্জিত সমাধান।
নিক স্টিনিমেটস

ঠিক আছে, আমি ঠিক পরে উত্তর দিয়েছিলাম। এছাড়াও আপনাকে গন্তব্য ডিরেক্টরিতে থাকতে হবে ... :)
আকীরা

0

সম্পাদিত উত্তর : সমস্যাটি হ'ল -Rআপনার অনুলিপিটি পুনরাবৃত্ত করে তোলে এবং তাই আপনি লুকানো ফাইলগুলি অনুলিপি করতে পারেন। আমি যা ব্যবহার করব তা এখানে:

find source/  -mindepth 1 -not \( -name .svn -prune \) | xargs -Iitem cp item target/

-mindepth 1পতাকা বলে findtoplevel ডিরেক্টরির উপেক্ষা করার। যেহেতু আপনি সেই ডিরেক্টরিটির সমস্ত সামগ্রী একটি নতুন শীর্ষ স্তরের ডিরেক্টরিতে অনুলিপি করতে চান, আমি ধরে নিই যে আপনি এটি চান না।

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


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

@ মিশেল: xargsভাঙা হয়নি, তবে ইউনিক্সের মতো সিস্টেমে ডিফল্টরূপে ফাঁকা জায়গা ফাইল ফাইল (বা ডিরেক্টরি নাম) ব্যবহার করা হবে না। যদি আপনার ফাইলনামগুলিতে (বা ডিরেক্টরিগুলির নাম) ফাঁকা বা "মজার" অক্ষর থাকে তবে তা মোকাবেলায় আপনাকে অতিরিক্ত কাজ করতে হবে। (ইন গনুহ find, সেখানে একটি সম্পূর্ণ অধ্যায় manপৃষ্ঠাটি এই সংখ্যার কারণ "অস্বাভাবিক FILENAMES" বলা।) -0মধ্যে পতাকা xargsএবং -print0জন্য findএই সমস্যা হ্যান্ডেল করতে সাহায্য করে। আমি আপনাকে প্রতিশ্রুতি দিচ্ছি, তবে -Rআপনি নিজের অনুলিপি কমান্ড ব্যবহার করতে চান না । এটি এসভিএন ডিরেক্টরিগুলি এড়াতে আপনি যা কিছু করেন তা পূর্বাবস্থায় ফেরাবে।
টেলিমাচুস

0

আমি মনে করি এটি আপনার গাছটি কতটা বড় তা নির্ভর করে তবে কেন প্রথমে সমস্ত কিছু অনুলিপি করবেন না , তারপরে .svn ফোল্ডারগুলি ট্রিম করুন:

find /dest-dir -type d -name .svn -exec rm -rf {} \;

?


কোনও মানদণ্ড ছাড়াই, আমার প্রাথমিক ধারণাটি হ'ল এটি সিপিইউ চক্রের দ্বৈত বর্জ্য: অনুলিপি করা এবং অপসারণ। সঠিক findকমান্ডটি তৈরি করতে কিছুটা বেশি সময় লাগতে পারে তবে আপনি কেবল একবার এটি করেন। আপনি একবারে সঠিক হয়ে গেলে আপনি কয়েকবার কমান্ডটি ব্যবহার করতে পারেন।
টেলিমাচুস

@ টেলিম্যাচাস - সত্য, তবে কম্পিউটারগুলির মধ্যে এটিই ভাল (মনে করা উচিত) - কৌশলপূর্ণ জিনিসগুলি করা যাতে আমাদের দরকার হয় না! সত্যিই - কিছু ফাইল কেবল তাড়াতাড়ি মুছে ফেলাতে অনুলিপি করার কী ক্ষতি আছে, যদি এর অর্থ আপনি এটি সম্পাদন করার জন্য যে আদেশগুলি আবিষ্কার করেছেন তা খুব সহজ?
স্টিভ ফলি

@ স্টিভ: আসলেই কোনও ক্ষতি নেই। যতদূর যায় এটি একটি সূক্ষ্ম সমাধান। এটি আমার পছন্দ মতো একটি নীতি অনুসরণ করে: "সম্ভব কাজ করা সহজতম কাজটি করুন" " অন্যদিকে, এটি আমার আরও আরও পছন্দ করে এমন একটি নীতি লঙ্ঘন করে: "আপনার সরঞ্জামগুলি শিখুন।" আমি কীভাবে findনিজেকে আরও ভালভাবে ব্যবহার করতে হয় তা শিখতে পছন্দ করব , যাতে আমাকে এটি করতে না হয়। তবে আপনি ঠিক বলেছেন: এই সমাধানটিতে আসলে কোনও ভুল নেই।
টেলিমাচাস

@ টেলিম্যাচাস: আমি "আপনার সরঞ্জামগুলি শিখুন" এর সাথে একমত নই। যখন আমি শুরু করলাম, আমি নিশ্চিত আমার উপরের ফাইন্ড কমান্ডটি তখন আমার কাছে খুব ক্রিপ্টিক লাগবে :-)
স্টিভ ফলি


0

আপনি বিপরীতেও করতে পারেন। সমস্ত কিছু অনুলিপি করুন নীচের কমান্ডটি ব্যবহার করে .svn ফোল্ডারগুলি মুছুন:

find . | grep ".svn" | xargs rm -rf
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.