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