কিভাবে আপনি লিনাক্সে cp কমান্ডের সাথে নিয়মিত এক্সপ্রেশন ব্যবহার করবেন?


20

আমি কেবলমাত্র একটি ডিরেক্টরি থেকে অন্য ডিরেক্টরিতে ফাইলগুলির উপসেট অনুলিপি করার চেষ্টা করছি cp তবে বার্তা নিয়ে শুভেচ্ছা জানাচ্ছি cp: cannot stat [^\.php]': No such file or directory। শুধুমাত্র ব্যবহার করে নিয়মিত এক্সপ্রেশন ব্যবহার করার একটি উপায় আছে cp কমান্ড?

উত্তর:


25

না।

দ্য cp কমান্ড নিয়মিত এক্সপ্রেশন হিসাবে তার আর্গুমেন্ট কোন প্রক্রিয়া করার ক্ষমতা ভোগদখল না। এমনকি ওয়াইল্ডকার্ডগুলি এটি দ্বারা পরিচালিত হয় না (বা সর্বাধিক এক্সিকিউটেবল); বরং তারা শেল দ্বারা পরিচালিত হয়।

cp test/* test2/ আসলে bash দ্বারা প্রসারিত হয়, এবং যে সব cp সত্যিই তার আর্গুমেন্ট জন্য দেখায় cp test/file1 test/file2 test/file3 test2/ (বা প্রকৃত বিষয়বস্তু উপর ভিত্তি করে উপযুক্ত যাই হোক না কেন test/ )।

এছাড়াও, আমি আপনার মতামত মনে করি না, [^\.php], আপনি এটি করতে চান কি মেলে হবে (এটি ধারণকারী ফাইল শুধুমাত্র মেলে না .php )।

আপনি সম্ভবত সন্ধান করতে চান find নিয়মিত এক্সপ্রেশন উপর ভিত্তি করে ফাইলের একটি তালিকা ফিল্টার করার জন্য ইউটিলিটি, এবং তারপর ব্যবহার করুন xargs ফিরে ফাইল তালিকা আবেদন করতে cp কমান্ড (অনুমান করা ফাইলগুলির অনুলিপি করার জন্য একটি অন্তর্নির্মিত হ্যান্ডলার নেই; আমি সরঞ্জামটির সাথে গভীরভাবে পরিচিত নই)।

আপনি চেষ্টা করতে পারেন:

find . ! -iregex ".*\.php.*" -exec cp {} /destination/folder/ \;

এই ফাইলের জন্য ক্রমাগত বর্তমান ডিরেক্টরি অনুসন্ধান করে যা "পাথ" .php ধারণ করে না এবং তাদের অনুলিপি করে /destination/folder/

অনুরোধ করা হয়েছে, আর্গুমেন্টগুলির একটি আরও স্পষ্ট বিভাজন:

  • . - অনুসন্ধান শুরু করার জন্য অবস্থান - এই ক্ষেত্রে, বর্তমান ডিরেক্টরি
  • ! - "না" অপারেটর, পরবর্তী পরীক্ষা ফলাফল বিপর্যস্ত
  • -iregex - কেস-অসংবেদক নিয়মিত এক্সপ্রেশন পরীক্ষা। পরবর্তী যুক্তি অভিব্যক্তি।
  • ".*\.php.*" নিয়মিত অভিব্যক্তি মিলেছে <Anything>.php<Anything> - যে কোনও ফাইলের মধ্যে ".php" আছে কোথাও। (নোট, নামের মধ্যে ".php" ধারণকারী একটি ফোল্ডারের ভিতরে থাকার সাথে সাথে, শুধুমাত্র ফাইলগুলি মিলানোর জন্য আপনাকে আরো জটিল অভিব্যক্তি প্রয়োজন)
  • -exec পূর্ববর্তী পরীক্ষা সত্য ফিরে যদি একটি কমান্ড সঞ্চালন। পরবর্তী যুক্তি কমান্ড, পর্যন্ত সব অবশিষ্ট আর্গুমেন্ট ; কমান্ড পাস করা হয়। দ্য {} ফাইলনাম নামক একটি বিশেষ যুক্তি।
  • cp - যে কমান্ডটি পাওয়া যায় সেটি মিলে যাওয়া প্রতিটি পাথের নামগুলিতে চালানো উচিত।
  • {} - খুঁজে পাওয়া যায় যে ফাইলের পথ, পাস cp একটি যুক্তি হিসাবে যাতে এটি কপি ফাইল কি জানেন
  • /destination/folder/ - যুক্তি পাস cp, বলছেন cp যেখানে এটি ফাইল অনুলিপি করা উচিত।
  • \; - এই ; টার্মিনেটর যে -exec খোঁজ করা. আমরা এটি দিয়ে পালাতে \ যাতে আপনার শেল এটি বিশ্লেষণ করার চেষ্টা করে না এবং পরিবর্তে কমান্ডের একটি যুক্তি হিসাবে এটি ফিড করে ( find )

একটি নিয়মিত অভিব্যক্তি লিখতে বরং এটি কঠিন যা "স্ট্রিং যা আছে না .php ", তাই আমরা পরিবর্তে বলুন find যে স্ট্রিং জন্য অনুসন্ধান করুন করা ধারণ করা .php এবং তারপর সঙ্গে ফলাফল বিপর্যস্ত !


2
find . -name [^\.php] -exec cp {} /path/to/location \; বিশেষ অক্ষর সঙ্গে ফাইল জন্য সতর্কতা অবলম্বন করা আবশ্যক।
Rob

@ ডર્થ অ্যান্ড্রয়েড - ধন্যবাদ। আমি যে সচেতন ছিল না cp এবং অন্যান্য বাইনারি নিয়মিত এক্সপ্রেশন প্রসারিত করতে পারবেন না। আপনি দেওয়া নমুনা উদাহরণ প্রতিটি বিকল্প এবং আর্গুমেন্ট মানে কি elaborating করা হবে? আমি যে জানি . বর্তমান ডিরেক্টরি নির্দেশ করে কিন্তু কি !, {}, \;, ইত্যাদি হিসাবে তারা কি মানে মানে? উদাহরণস্বরূপ কেন আপনি অব্যাহতি আছে ;?
PeanutsMonkey

@ রব - বিশেষ ফাইলের অর্থ কী?
PeanutsMonkey

@ রব - আমি নির্দিষ্ট ফাইলগুলি মুছে ফেলার জন্য একই রকম অভিব্যক্তি চেষ্টা করেছি তবে এটি ডিরেক্টরিতে সমস্ত ফাইল মুছে ফেলতে শেষ হয়েছে। আমার আদেশ ছিল find . -name '[^\.txt]' -exec rm {} \; তাই আমার ব্যবহার অনিচ্ছা find। সম্ভবত আমার অংশ একটি ভুল কিন্তু আমি ভুল কি অনিশ্চিত। যতদূর আমার বোঝার {} কমান্ড দ্বারা পাওয়া প্রতিটি ফাইল বোঝায় find . -name '[^\.txt]'
PeanutsMonkey

আপনি Regex সঙ্গে মেলে চেষ্টা করছেন কি?
Rob

9

আপনি grep এবং xargs মত কনসোল থেকে কয়েকটি অন্যান্য সরঞ্জাম ব্যবহার করতে পারেন।

ls -1 some_folder | egrep 'some_extended_regex' | xargs cp -t destination_folder

কিভাবে {} যে বিভিন্ন -t?
PeanutsMonkey

2
এই ক্ষেত্রে অনেক না। Xargs এর জন্য বিকল্প সিনট্যাক্স 'xargs cp {} destination_folder' হবে। স্ট্যান্ডার্ড সিপি সিনট্যাক্সটি শেষে এক বা একাধিক উত্স এবং এক গন্তব্যে লাগে, যখন আপনি -t বিকল্প ব্যবহার করেন, আপনি -t এর পরে গন্তব্যটি নির্দিষ্ট করতে পারেন, তারপরে উত্সগুলির জন্য বাকি লাইনটি ব্যবহার করুন। আমি শুধু এই ক্ষেত্রে আরও সুবিধাজনক -T বিকল্প খুঁজে। অন্য উদাহরণে {} এই ক্ষেত্রে ফাইল নামকরণে xargs (stdin) এ পাইপ করা হয় তা দ্বারা প্রতিস্থাপিত হয়।
0xAF
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.