আমি আপনাকে অনুরোধ করছি, cp
কমান্ড লাইনে সরল শেল প্রসার থেকে দূরে সরে যান - শেল প্রসারণে সব ধরণের আহেম "আকর্ষণীয়" কোণার কেস রয়েছে (এবং অ্যান্ডেন্টেড পুনরাবৃত্তি, এবং .., ফাঁকা স্থান, মুদ্রণযোগ্য স্টাফ, হার্ডলিঙ্কস, প্রতীকী লিঙ্কগুলি এবং find
পরিবর্তে ব্যবহার করুন) (এটি findutils
প্যাকেজে আসে , যদি আপনি এটি ইনস্টল না করে থাকেন - যা অদ্ভুত হবে, সমস্ত বিতরণ এটি ডিফল্টরূপে ইনস্টল করে):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
ধাপে ধাপে ব্যাখ্যা:
-H
find
সিমলিংকগুলি অনুসরণ না করার কারণ ঘটবে (আপনি যে প্রকৃত শীর্ষ স্তরের ডিরেক্টরি নামটি দিয়েছেন এটি একটি সিমিলিংক ব্যতীত; এটি অনুসরণ করবে))
/path/to/toplevel/dir/
স্পষ্টতই, আপনি যে ডিরেক্টরিটি সেটিংস ফাইল এবং ডিরেক্টরিগুলি ব্যাক আপ করতে চান সেগুলি হোস্ট করে এমন ডিরেক্টরিটি দিয়ে আপনার দ্বারা প্রতিস্থাপিত হওয়ার কথা।
-maxdepth 1
find
যার নাম বিন্দু দিয়ে শুরু হয় এমন কোনও ডিরেক্টরিতে পুনরাবৃত্তভাবে নেমে যাওয়া বন্ধ হবে । আমাদের এটি পুনরাবৃত্তি করার দরকার নেই, এটি cp
আমাদের জন্য করবে, আমাদের কেবলমাত্র এই স্তরের নামগুলি দরকার।
-name '.*'
বলে find
যে আমরা সমস্ত নাম চাই যা বিন্দু দিয়ে শুরু হয়। পরিবেশের পরিবর্তনশীল POSIXLY_CORRECT
সেট করা থাকলে এটি সঠিকভাবে কাজ করবে না তবে এটি খুব কমই (যদি কখনও হয়) হয়। এটি এখন পর্যন্ত আমরা উল্লেখ করা প্রথম ম্যাচের শর্ত।
a \( ....... \)
এটি বন্ধনীগুলির আরও জটিল শর্ত এবং তারপরে (আমি এটি ব্যবহার করার জন্য ..... ব্যবহার করেছি, এটি নীচে ব্যাখ্যা করা হয়েছে)) আমাদের বন্ধনীর হাত থেকে বাঁচতে হবে যেহেতু তারা অন্যথায় শেল দ্বারা ব্যাখ্যা করা হবে, অতএব তাদের সামনে ব্যাকস্ল্যাশ,
-type d -o -type f -o -type l
একটি বা তাদের মধ্যে তিনটি শর্ত । -type d
ডিরেক্টরি -type f
মেলে, নিয়মিত ফাইলের সাথে -type l
মেলে এবং সিমলিংকের সাথে মেলে। আপনি যা চান তা নির্বাচন করতে পারেন - উদাহরণস্বরূপ, আপনি যদি সেটিংস ডিরেক্টরিগুলি ব্যাকআপ করতে না চান তবে বাদ দিন -type d
(এবং এর -o
ঠিক পিছনে ডানদিকে স্পষ্টভাবে।)
-exec ..... \;
find
প্রতিবার কোনও ম্যাচের মুখোমুখি হওয়ার সাথে সাথে কমান্ড কার্যকর করতে বলে । কমান্ডের শেষটি একটি সেমিকোলন দ্বারা চিহ্নিত করা হয়, যা শেল ব্যাখ্যাটি এড়াতে আমাদের আবার একটি ব্যাকস্ল্যাশ দিয়ে পালাতে হবে। সেই কমান্ড লাইনের মধ্যেই আপনি {}
বর্তমানে যেখানে মুখোমুখি ম্যাচের নামটি শেষ করতে চান সেখানে ব্যবহার করতে হবে। যেহেতু শেল এছাড়াও কোঁকড়া ধনুর্বন্ধনী ভুল ব্যাখ্যা পারে, আপনি, অ্যাপস্ট্রফিগুলি তাদের স্থান হওয়া উচিত যেমন '{}'
। এই ক্ষেত্রে আমরা যে আদেশটি কার্যকর করতে চাইছি তা হ'ল cp -a '{}' /path/to/destination/dir/
(-এর অর্থ সংরক্ষণাগার, যা সাব-ডিরেক্টরিতে পুনরাবৃত্তি করে, লিঙ্ক হিসাবে সিমলিংকগুলি অনুলিপি করে এবং অনুমতি এবং বর্ধিত বৈশিষ্ট্য সংরক্ষণ করে এবং /path/to/destination/dir/
স্পষ্টতই গন্তব্য ডিরেক্টরিটির নাম - এটি প্রতিস্থাপন করুন))
সুতরাং, সরল ইংরেজিতে, এই find
কমান্ড লাইনটি এটি বলে:
/ পথে / থেকে / শীর্ষে / দির / এ শুরু করুন। কোনও উপ-ডিরেক্টরিতে নামবেন না। যার নাম বিন্দু দিয়ে শুরু হয় এমন সমস্ত ডিরেক্টরি, ফাইল এবং প্রতিলিঙ্কগুলি সন্ধান করুন। আপনি যে সকল সন্ধান পেয়েছেন তাদের প্রত্যেকের জন্য, এটি / পাথ / টু / গন্তব্য / দির / সংরক্ষণ প্রকৃতি, অনুমতি এবং বর্ধিত বৈশিষ্ট্যগুলিতে অনুলিপি করুন।
-r
এবং এর মধ্যে কোনও পার্থক্য আছে কি-R
?