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


31

আমি যদি সমস্ত *.soফাইলগুলি অনুলিপি srcকরতে dstচাইতাম তবে:

cp src/*.so dst

যাইহোক, আমি সব অনুলিপি করতে চান *.sosrc থেকে ফাইল এবং এটা subdirs মধ্যে dst। কোন সংকেত সনাক্ত করুন?

উত্তর:


36

চেষ্টা করুন:

find src/ -type f | grep -i so$ | xargs -i cp {} dst

17
findপ্যাটার্ন মিল এবং কমান্ড কার্যকর করতে পারে। পাইপ করার কোন প্রয়োজন নেই তার আউটপুট:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'
jáquer

1
হ্যাঁ, তবে এটি একটি পাইপলাইন পড়া প্রায়শই সহজ, প্যারামিটারে grepব্যবহৃত সাধারণ শেল প্যাটার্নের তুলনায় প্যাটার্নের মিলের ক্ষমতাও অনেক বেশি । পরামিতি থেকেও অনেক বেশি শক্তিশালী । -namefindxargs-execfind
মাইক ইনশ

2
@ জাকেরের সমাধান আরও ভাল কারণ ম্যাকোএসএক্স এক্সার্গেটে ইউটিলিটি -i বিকল্প নেই। তবে তার সমাধানটি কবজির মতো কাজ করে।
বিয়ালিক্স

আমি জ্যাকারের সমাধান সম্পর্কে @ বিয়ালিক্সের মন্তব্যটি না পড়ার আগে পর্যন্ত আমি জার্গার্স -i যুক্তিতে ত্রুটি বার্তার সাথে লড়াই করে যাচ্ছিলাম, যা আমার ম্যাকের উপর পুরোপুরি কাজ করেছিল। ধন্যবাদ
সান্নয়

এটি কি প্রয়োজন মতো উপ-ডিরেক্টরি তৈরি করবে?
লেনার্ট রোল্যান্ড

15

আপনি যদি ব্যাশ ব্যবহার করছেন তবে ফাইল এবং ডিরেক্টরিগুলি পুনরাবৃত্তভাবে মেলানোর জন্য আপনি globstar শেল বিকল্পটি চালু করতে পারেন :

shopt -s globstar
cp src/**/*.so dst

আপনার নামগুলির সাথে শুরু হওয়া .ফাইলগুলি এবং / অথবা ডিরেক্টরিগুলির মধ্যে এবং এর অধীনে ফাইলগুলির নামগুলি শুরু করা উচিত ., dotglobঅপশনটিও (যেমন, সহ shopt -s dotglob) সেট করুন । আপনি উভয়কে একটি কমান্ডে সেট করতে পারেন:

shopt -s globstar dotglob

একটি দিয়ে শুরু করে উপ-ডিরেক্টরিতে ফাইলগুলি অনুলিপি করে না। তাদের নামে
rboy

8

আমি মাইক দ্বারা প্রস্তাবিত আদেশটি চেষ্টা করেছিলাম:

find src/ -type f | grep -i so$ | xargs -i cp {} dst

তবে এটি সমস্ত ফাইলকে dstতাদের আপেক্ষিক পথগুলি হারিয়ে ডিরেক্টরিতে ফেলে ফেলা হয়েছে।

আপেক্ষিক পথ ধরে রাখতে কমান্ডটি এটিকে সংশোধন করতে হবে:

find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}

7
+1 টি। যাইহোক, এটি ধরে নেওয়া হয় যে সম্পর্কিত উত্সের পাথের সাথে সম্পর্কিত ডিরেক্টরিগুলি নীচে বিদ্যমান dst। যদি তা না হয় তবে ব্যবহার করুন cp --parents। এছাড়াও, ফাইলের নামগুলি উদ্ধৃত করতে ভুলবেন না। সুতরাং: ... | xargs -i cp --parents "{}" dst(নোট করুন যে শেষ আর্গুমেন্টটি cpএখন "গন্তব্য ডিরেক্টরি" just কমান্ড এমনকি খাটো (এবং সম্ভবত আরও দ্রুত) তৈরি করা যেতে পারে ব্যবহার -tপতাকা: ... | xargs cp --parents -t dst
স্টেফান202

1
@ স্টিফান202 আমাকে ব্যবহার করতে হয়েছিল... | xargs cp {} --parents -t dst.
ওয়ারওয়ারিয়াক

ম্যাকের জন্য তাদের জন্য --parentsউপলব্ধ নেই। আমি dittoতার জায়গায় ব্যবহার করেছি : স্ট্যাকওভারফ্লো
ব্রায়ান ইয়াং

3

এটি করার আরেকটি উপায় হ'ল:

find src/ -type f -name "*.so" -exec cp {} dst/ \;

আর এই সংখ্যা কমাতে উচিত cpপ্রসেস: ... -exec cp -t dst/ {} +
কামিল ম্যাকিয়েরোভস্কি

আরে কামিল! মন্তব্য করার জন্য আপনাকে ধন্যবাদ! আপনার সমাধান কীভাবে জিনিসগুলিকে দ্রুত করে তোলে আপনি দয়া করে আমাকে ব্যাখ্যা করতে পারেন! সর্বদা আরও জানতে আগ্রহী :)
কিরিয়াকোস

আপনি যখন সমাপ্ত -execহন ;, {}একবারে একটি পাথ দ্বারা প্রতিস্থাপিত হয়। আপনি cpপ্রতিটি ফাইলের জন্য পৃথক পাবেন । সঙ্গে +সিনট্যাক্স findপ্রতিস্থাপিত {}একাধিক ফলাফল সঙ্গে (কমান্ড লাইন দৈর্ঘ্য একটি সিস্টেম-সংজ্ঞায়িত সীমা পর্যন্ত; সীমাবদ্ধতা: {}সামনে শেষ জিনিস হতে হবে +, অত cp -t)। একটি প্রক্রিয়া তৈরি এবং সমাপ্তি তুলনামূলকভাবে ব্যয়বহুল জিনিস। এই কারণে +আপনি যখন প্রচুর ফলাফল আশা করেন এটি ব্যবহার করা ভাল । এক্ষেত্রে প্রচুর ফাইল অনুলিপি করা হতে পারে যেভাবেই হোক অনেক বেশি সময় লাগতে পারে যাতে পার্থক্যটি নজরে না যায়; তবুও এটি একটি ভাল অনুশীলন।
কামিল Maciorowski

1

গ্রেডটি ফাইন্ড- এর নাম ব্যবহার করে প্রতিস্থাপন করা যেতে পারে :

find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.