दिलचस्प पोस्ट
क्या UITableView में एकल UITableViewCell को ताज़ा करना संभव है? गूगल मानचित्र एंड्रॉइड में एपीआई कुंजी त्रुटियों पर हस्ताक्षर किए ब्राउजर को फ्रीजिंग से तीव्र जावास्क्रिप्ट लूप को कैसे रोकें पुराने रिमोट जीआईटी की शाखाओं को साफ करना जावा में विभाजन हमेशा शून्य (0) में होता है? ES6 एरो फ़ंक्शंस में `तर्कों 'पर आधिकारिक जानकारी विंडोज़ एपीआई कोड पैक: यह कहां है? एक वेब। कॉन्फिग फ़ाइल का उपयोग कर HTTPS को कैसे लागू करें वहाँ कोई अच्छा Markdown जावास्क्रिप्ट पुस्तकालय या नियंत्रण है? कैसे जांचने के लिए कि क्या mod_rewrite सर्वर पर सक्षम है? "जीआईटी चेकआउट मूल / <शाखा>" चलाने के बाद गिट मुझे "किसी भी शाखा में नहीं है" क्यों बताता है? वैध ईमेल पते की जांच करने के लिए पायथन? सी # में बैच फ़ाइल निष्पादित OpenCV के cvWaitKey () फ़ंक्शन क्या करता है? jQuery या चयनकर्ता?

यूनिक्स / लिनक्स शैल में मिलान करने के बाद मैं व्युत्क्रम या नकारात्मक वाइल्डकार्ड का उपयोग कैसे कर सकता हूं?

कहें कि मैं एक निर्देशिका की सामग्री की प्रतिलिपि बनाना चाहता हूं जिसमें फ़ाइलें और फ़ोल्डर्स शामिल होते हैं जिनके नामों में शब्द 'संगीत' होता है

cp [exclude-matches] *Music* /target_directory 

इसे पूरा करने के लिए [बहिष्कार-मैच] के स्थान पर क्या जाना चाहिए?

वेब के समाधान से एकत्रित समाधान "यूनिक्स / लिनक्स शैल में मिलान करने के बाद मैं व्युत्क्रम या नकारात्मक वाइल्डकार्ड का उपयोग कैसे कर सकता हूं?"

बैश में आप इसे extglob विकल्प को सक्षम करने से, ऐसा कर सकते हैं (सीपी के लिए एलएस की जगह और निश्चित रूप से लक्ष्य निर्देशिका जोड़ें)

 ~/foobar> shopt extglob extglob off ~/foobar> ls abar afoo bbar bfoo ~/foobar> ls !(b*) -bash: !: event not found ~/foobar> shopt -s extglob #Enables extglob ~/foobar> ls !(b*) abar afoo ~/foobar> ls !(a*) bbar bfoo ~/foobar> ls !(*foo) abar bbar 

बाद में आप एक्सप्लॉग को अक्षम कर सकते हैं

 shopt -u extglob 

extglob शेल विकल्प आपको कमांड लाइन में अधिक शक्तिशाली पैटर्न मिलान प्रदान करता है।

आप इसे shopt -s extglob साथ shopt -s extglob , और इसे shopt -u extglob साथ बंद कर shopt -u extglob

आपके उदाहरण में, आप शुरू में ऐसा करेंगे:

 $ shopt -s extglob $ cp !(*Music*) /target_directory 

पूर्ण उपलब्ध एक्सएनएल ग्लोबल बिंग ऑपरेटर्स हैं ( man bash से अंश):

यदि एक्सट्लॉब शेल विकल्प शॉपट बिल्टिन के उपयोग से सक्षम है, तो कई विस्तारित पैटर्न मिलान ऑपरेटर पहचाने जाते हैं। निम्नलिखित विवरण में, एक पैट टर्न-लिस्ट एक या एक से अधिक पैटर्न की एक सूची है जो। निम्न नमूनों में से एक या अधिक का उपयोग करके संमिश्र पैटर्न का गठन किया जा सकता है:

  • (पैटर्न-सूची)
    शून्य या एक दिए गए पैटर्न की घटना से मेल खाता है
  • * (पैटर्न-सूची)
    दिए गए नमूनों की शून्य या अधिक घटनाओं से मेल खाता है
  • + (पैटर्न-सूची)
    दिए गए पैटर्न के एक या अधिक घटनाओं से मेल खाता है
  • @ (पैटर्न-सूची)
    दिए गए पैटर्न में से एक से मेल खाता है
  • ! (पैटर्न-सूची)
    दिए गए पैटर्नों में से किसी को छोड़कर कुछ मेल खाता है

इसलिए, उदाहरण के लिए, यदि आप वर्तमान निर्देशिका में सभी फाइलों को सूचीबद्ध करना चाहते हैं जो .h .c या .h फाइल नहीं हैं, तो आप ऐसा करेंगे:

 $ ls -d !(*@(.c|.h)) 

बेशक, सामान्य शैल ग्लोबिंग काम करता है, इसलिए अंतिम उदाहरण भी लिखा जा सकता है:

 $ ls -d !(*.[ch]) 

बाश में नहीं (जो मुझे पता है), लेकिन:

 cp `ls | grep -v Music` /target_directory 

मुझे पता है कि यह वही नहीं है जो आप चाहते थे, लेकिन यह आपके उदाहरण को हल करेगा।

यदि आप exec कमांड का उपयोग करने के mem लागत से बचने के लिए चाहते हैं, तो मेरा मानना ​​है कि आप ज़ारगास के साथ बेहतर कर सकते हैं। मुझे लगता है कि निम्नलिखित के लिए एक और अधिक कुशल विकल्प है

 find foo -type f ! -name '*Music*' -exec cp {} bar \; # new proc for each exec find . -maxdepth 1 -name '*Music*' -prune -o -print0 | xargs -0 -i cp {} dest/ 

आप लूप के for एक बहुत सरल उपयोग भी कर सकते हैं:

 for f in `find . -not -name "*Music*"` do cp $f /target/dir done 

मेरी निजी वरीयता के लिए grep और समय कमांड का उपयोग करना है इससे किसी को शक्तिशाली और पठनीय लिपियों को लिखने की सुविधा मिल जाती है जो यह सुनिश्चित करती है कि आप जो चाहते हैं वही कर रहे हैं। इसके अलावा एक गूंज कमांड का उपयोग करके आप वास्तविक ऑपरेशन को पूरा करने से पहले एक सूखी चाल कर सकते हैं। उदाहरण के लिए:

 ls | grep -v "Music" | while read filename do echo $filename done 

उन फाइलों को प्रिंट करेंगे जो आप कॉपी करेंगे। यदि सूची सही है तो अगले चरण के लिए प्रति आदेश कमांड के साथ प्रतिध्वनि कमांड को प्रतिस्थापित करना है:

 ls | grep -v "Music" | while read filename do cp "$filename" /target_directory done 

इसके लिए एक समाधान खोजने के साथ मिल सकता है

 $ mkdir foo bar $ touch foo/a.txt foo/Music.txt $ find foo -type f ! -name '*Music*' -exec cp {} bar \; $ ls bar a.txt 

ढूंढें में कुछ विकल्प हैं, आप जो भी शामिल करते हैं और बाहर कर देते हैं, उसके बारे में बहुत विशिष्ट हो सकते हैं।

संपादित करें: एडम ने टिप्पणी में कहा कि यह पुनरावर्ती है इस विकल्प को नियंत्रित करने में दिमाग और अधिकतम डिप्था उपयोगी हो सकते हैं।

बैश में, shopt -s extglob का एक विकल्प GLOBIGNORE चर है । यह वास्तव में बेहतर नहीं है, लेकिन मुझे याद रखना आसान लगता है।

एक उदाहरण जो हो सकता है कि मूल पोस्टर क्या चाहते थे:

 GLOBIGNORE="*techno*"; cp *Music* /only_good_music/ 

जब किया जाए, स्रोत निर्देशिका में rm *techno* में सक्षम होने के लिए unset GLOBIGNORE को unset GLOBIGNORE करें

यह बिल्कुल 'संगीत' को छोड़कर ऐसा करेगा

 cp -a ^'Music' /target 

यह और है कि संगीत जैसी चीज़ों को छोड़ने के लिए? * या *? संगीत

 cp -a ^\*?'complete' /target cp -a ^'complete'?\* /target 

एक ऐसी चाल जो मैंने अभी तक नहीं देखी है, जो कि extglob , find या grep का उपयोग नहीं करता है, दो फ़ाइल सूचियों को सेट के रूप में रखने और "diff" को comm का उपयोग करने के लिए प्रयोग करना है:

 comm -23 <(ls) <(ls *Music*) 

comm diff पर बेहतर है क्योंकि इसमें अतिरिक्त क्रूरता नहीं है

यह सेट 1, ls सभी तत्वों को रिटर्न देता है, जो कि सेट 2 में भी नहीं हैं, ls *Music* । इसके लिए ठीक से कार्य करने के क्रमबद्ध क्रम में दोनों सेट की आवश्यकता होती है ls और ग्लोब विस्तार के लिए कोई समस्या नहीं है, लेकिन अगर आप कुछ find का उपयोग कर रहे find , तो sort

 comm -23 <(find . | sort) <(find . | grep -i '.jpg' | sort) 

संभावित उपयोगी

निम्नलिखित कार्यों में वर्तमान dir में *.txt फ़ाइलों को सूचीबद्ध करता है, जो कि संख्या के साथ शुरू होता है

यह bash , dash , zsh और अन्य सभी POSIX संगत गोले में काम करता है।

 for FILE in /some/dir/*.txt; do # for each *.txt file case "${FILE##*/}" in # if file basename... [0-9]*) continue ;; # starts with digit: skip esac ## otherwise, do stuff with $FILE here done 
  1. लाइन में एक /some/dir /some/dir/*.txt पैटर्न के कारण लूप को सभी फाइलों पर फिर से दोहराना होगा, जिसका नाम अंत में .txt

  2. पंक्ति दो में एक केस स्टेटमेंट का इस्तेमाल अवांछित फाइलों को बाहर निकालने के लिए किया जाता है। – ${FILE##*/} अभिव्यक्ति किसी फ़ाइल नाम के किसी भी प्रमुख डायर नाम घटक (यहाँ /some/dir/ ) को छांटती है जिससे कि पैटर फाइल के केवल बेसनेम के विरुद्ध मेल खा सके। (यदि आप प्रत्यय पर आधारित फ़ाइल नामों को केवल तलना कर रहे हैं, तो आप इसे इसके बजाय $FILE तक सीमित कर सकते हैं।)

  3. पंक्ति तीन में, case पैटर्न [0-9]* ) लाइन से मेल खाने वाली सभी फाइलें छोड़ी जाएँगी ( continue के for कूपन for लूप के अगले पुनरावृत्त पर कूदता है)। – यदि आप चाहते हैं कि आप यहां कुछ और दिलचस्प कर सकते हैं, जैसे सभी फाइलों को छोड़ना जैसे कि [!az]* का उपयोग करते हुए अक्षर (ए-जेड) से शुरू न करें, या आप कई प्रकार के फ़ाइल नामों को छोड़ने के लिए कई पैटर्न का उपयोग कर सकते हैं [0-9]*|*.bak फ़ाइलों को छोड़ने के लिए दोनों .bak फ़ाइलें, और फ़ाइलें जो किसी संख्या से शुरू नहीं होती है