लिनक्स में cp कमांड के साथ आप रेगुलर एक्सप्रेशन का उपयोग कैसे करते हैं?


22

मैं केवल cpसंदेश के साथ अभिवादन का उपयोग करके एक निर्देशिका से दूसरे में फ़ाइलों के सबसेट को कॉपी करने का प्रयास कर रहा हूं cp: cannot stat [^\.php]': No such file or directory। क्या केवल cpकमांड का उपयोग करके नियमित अभिव्यक्ति का उपयोग करने का एक तरीका है ?

जवाबों:


29

नहीं।

cpआदेश नियमित अभिव्यक्ति के रूप में अपने तर्कों के किसी भी कार्रवाई करने के लिए क्षमता के अधिकारी नहीं है। यहां तक ​​कि वाइल्डकार्ड इसे (या अधिकांश निष्पादन योग्य) द्वारा नियंत्रित नहीं किया जाता है; बल्कि वे खोल द्वारा नियंत्रित किए जाते हैं।

cp test/* test2/वास्तव में बैश द्वारा विस्तारित किया जाता है, और जो 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 - कमांड जो find` पथ मिलान नामों में से प्रत्येक पर चलना चाहिए।
  • {}- जिस फाइल को पाया गया, वह cpएक तर्क के रूप में पारित हुई ताकि यह पता चले कि किस फाइल को कॉपी करना है
  • /destination/folder/- यह करने के लिए फ़ाइल को कॉपी करना चाहिए cp, cpयह बताते हुए तर्क पास हो गया।
  • \;- यह वह ;टर्मिनेटर है जिसकी -execतलाश की जा रही है। हम इसे इस तरह से बचते हैं \कि आपका खोल इसे पार्स करने की कोशिश नहीं करता है और इसके बजाय इसे कमांड को तर्क के रूप में खिलाता है ( find)

इसके बजाय एक नियमित अभिव्यक्ति लिखना मुश्किल है जो "स्ट्रिंग्स जो नहीं है .php" से मेल खाती है , इसलिए हम इसके बजाय findउन स्ट्रिंग्स की खोज करने के लिए कहते हैं जो इसमें शामिल हैं और फिर परिणामों के साथ उल्टा करते हैं ।.php!


2
find . -name [^\.php] -exec cp {} /path/to/location \;विशेष वर्ण वाली फ़ाइलों के लिए सावधान रहें।
रोब

@ डर्थ Android - धन्यवाद। मुझे पता नहीं था कि cpऔर अन्य बायनेरिज़ नियमित अभिव्यक्ति का विस्तार करने में सक्षम नहीं थे। क्या आप इस बात का विस्तृत वर्णन करेंगे कि आपके द्वारा दिए गए नमूना उदाहरण में प्रत्येक विकल्प और तर्क का क्या अर्थ है? मुझे पता है कि .वर्तमान निर्देशिका को संदर्भित करता है, लेकिन क्या करूँ !, {}, \;, आदि में अच्छी तरह से उनके अर्थ को देखें? उदाहरण के लिए आपको क्यों बचना है ;?
मूँगफली के दाने 20

@Rob - विशेष फ़ाइलों से आपका क्या अभिप्राय है?
मूँगफली के दाने 20

@Rob - मैंने विशिष्ट फ़ाइलों को हटाने के लिए एक समान अभिव्यक्ति का प्रयास किया, हालांकि इसने निर्देशिका की सभी फ़ाइलों को हटा दिया। find . -name '[^\.txt]' -exec rm {} \;इसलिए मेरी आज्ञा का उपयोग करने की अनिच्छा थी find। शायद मेरी ओर से एक गलती लेकिन मैं अनिश्चित हूं कि मैंने क्या गलत किया। जहाँ तक मेरी समझ {}कमांड द्वारा पाई गई प्रत्येक फाइल को संदर्भित करती हैfind . -name '[^\.txt]'
मूंगफली का मटका

क्या आप रेगेक्स के साथ मैच करने की कोशिश कर रहे हैं?
रोब

10

आप कंसोल से कुछ अन्य टूल का उपयोग कर सकते हैं, जैसे कि grep और xargs।

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

उससे {}अलग कैसे है -t?
मूंगफली का मटका

2
इस मामले में ज्यादा नहीं। Xargs के लिए वैकल्पिक वाक्यविन्यास 'xargs cp {} डेस्टिनेशन_फ़ोल्डर' होगा। मानक cp सिंटैक्स एक या कई स्रोतों और अंत में एक गंतव्य लेता है, जब आप -t विकल्प का उपयोग करते हैं, तो -t के बाद गंतव्य निर्दिष्ट कर सकते हैं, फिर स्रोतों के लिए शेष पंक्ति का उपयोग करें। मुझे इस मामले में सिर्फ -t विकल्प अधिक सुविधाजनक लगता है। दूसरे उदाहरण में {} को xargs (स्टडिन) पर पाइप करने के लिए प्रतिस्थापित किया जाता है, इस मामले में फ़ाइल नाम।
0xAF

-1

आप उपयोग करने के लिए आसान आदेश का पालन कर सकते हैं:

find /home/usr/search_dir -iname *file_name_portion*.txt | xargs cp -t /home/usr/destination_folder

शांत हा !!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.