कैसे पूरा करने के लिए पैटर्न जोड़ने के लिए पूरा (unzip के लिए)?


12

जब मैं टाइप करता हूँ

unzip <tab>

मुझे समाप्त होने वाली सभी फाइलों की एक सूची मिलती है .zip, जो unzipकमांड के लिए टैब पूरा होने का मानक व्यवहार है ।

हालाँकि, मैं unzipउन फ़ाइलों की सूची को भी पूरा करना चाहता हूं, जो फाइलों के .udpअलावा समाप्त होती हैं .zip। मैं अपने स्थानीय में यह व्यवहार कैसे प्राप्त कर सकता हूं .bashrc?

जवाबों:


23

इसके बजाय टिप्पणी पर रखने के ...


complete -f -X '!*.@(zip|udp)' unzip

के लिए पूर्णता जोड़ना चाहिए

-f -X '!*.@(zip|udp)'
 |  |  | |||________|
 |  |  | ||     |
 |  |  | ||     +- filterpat: zip or udp
 |  |  | |+-------------  @ : Matches one of the given patterns
 |  |  | +-------------- *. : Anything+<dot>
 |  |  +----------------  ! : Negate
 |  +------------------- -X : Filter out matches in "filterpat"
 +---------------------- -f : files

दूसरे शब्दों में: फाइलें पूरी करें और सभी को समाप्त न करें .zipया में समाप्त न करें .udp


अतिरिक्त

यदि आप -o defaultपूर्णता जोड़ते हैं तो सभी फाइलों और निर्देशिकाओं को पूरा / मैच करेगा यदि कोई फाइल समाप्त नहीं हो रही है .zipया नहीं .udp

आप जोड़ देते हैं तो -o plusdirsपूरा होने के किसी भी निर्देशिका जोड़ देगा अलावा फ़ाइलों के अंत में से किसी मैच के लिए .zipया .udp

वर्तमान

जब आप उपयोग करते हैं complete -p unzipतो आपको वर्तमान पैटर्न मिलता है।

आपकी टिप्पणियों से ऐसा लगता है जैसे आप +या तो या @पैटर्न में गायब हैं , जैसे कि:

# Err:
complete -f -X '!*.(zip|udp)' unzip
                   |
                   +---- Missing + or @

जिसका अर्थ होगा किसी भी फाइल का शाब्दिक रूप से समाप्त होना.(zip|udp) । उदाहरण के लिए

touch 'file_test.(zip|udp)'

मैनुअल के इस भाग पर भी एक नज़र:

यह संभव है उदाहरण के extglobलिए सक्षम नहीं है। इसके द्वारा सक्षम करें:

shopt -s extglob

shoptदर्ज करके सभी सेटिंग्स की वर्तमान स्थिति की जाँच करें :

shopt

समारोह

यदि ऐसा है -F somethingतो इसका मतलब यह है कि यह किसी फ़ंक्शन का उपयोग करता है जो पूर्णता की सूची उत्पन्न करने के लिए कुछ नाम देता है

_filedir_xspecआम तौर पर एक डेबियन कार्य है। आपके पास ऐसा कुछ हो सकता है:

$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion

जिसका अर्थ /usr/share/bash-completion/bash_completionहै खट्टा हो जाना। यहां आपको प्रश्न में फ़ंक्शन मिलेगा । नीचे कुछ पंक्तियाँ आपको दिखती हैं कि यह फ़ंक्शन / पूर्णता _install_xspecजैसे नाम के एक फ़ंक्शन द्वारा जोड़ी गई है :

_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo

मैनुअल प्रविष्टियाँ:


टिप्पणियों के लिए अद्यतन 1:

- अमान्य अभिलेखों या फ़ाइल अनुमतियों के कारण कोई मिलान नहीं।

यह परिणाम को प्रभावित नहीं करना चाहिए। completeकेवल नियमों द्वारा दी गई फाइलों से मेल खाता है और फाइलों की कोई प्रोसेसिंग नहीं करता है। यदि आप उन्हें सूचीबद्ध कर सकते हैं ls, तो उन्हें मेल खाना चाहिए।

एक साइड नोट के रूप में एक पूर्ण फ़ंक्शन का उपयोग करके ऐसी कार्यक्षमता जोड़ सकता है :

function _unzip_validated() {
    # 1. Generate list of files ending in e.g. .zip and .udp
    # 2. Validate each file and remove invalid ones from file list.
}

complete -F _unzip_validated unzip

- रंग की। lsभेद क्यों करता test.zipहै test.upd?

यह प्रभावित नहीं करता है complete। द्वारा रंग lsप्रदान किए जाते हैं $LS_COLORS। प्रयत्न:

echo "$LS_COLORS" | tr : '\n' | sort

आपको कुछ ऐसा देखना चाहिए *.zip=01;31जिसका अर्थ है:

*.zip=01;31
|____| |  |
   |   |  +--- Red
   |   +------ Bold
   +---------- Files with .zip extension

*.udp दूसरी ओर इसके साथ कोई प्रविष्टि नहीं जुड़ी है, इसलिए कोई रंग नहीं है।


अगला चरण (पहले होना चाहिए)

  1. टर्मिनल खोलें और परीक्षण फ़ाइलों के साथ एक निर्देशिका पर जाएं। .Zip और .udp दोनों
  2. दर्ज bash --norc
  3. दर्ज complete -f -X '!*.@(zip|udp)' unzip
  4. दर्ज shopt -s extglob
  5. दर्ज unzip <tab><tab>

परिणाम?

इसके अलावा, अपने प्रश्न के नीचे संपादित करें पर क्लिक करें और इसका आउटपुट जोड़ें:

bind -V
shopt
env

मददगार हो सकता है।


आपकी उत्कृष्ट और लंबी व्याख्या के लिए बहुत-बहुत धन्यवाद, लेकिन फिर भी यह काम नहीं करता है। complete -p unzipपैदावार complete -f -X '!*.@(zip|udp)' unzip, और unzip <tab>नामित फ़ाइल को पूरा करता है test.zip। हालाँकि, डायरेक्टरी में एक फ़ाइल होती है जिसका नाम test.updटैब नहीं होता है unzip। फ़ाइल अनुमतियों के तथ्य या फ़ाइल की शून्य लंबाई शायद इस अजीब व्यवहार की व्याख्या करें?
एलेक्स

@ एलेक्स: खाली और वैध दोनों फाइलों के साथ-साथ उन फाइलों पर भी पूरा होना चाहिए जहां किसी की अनुमति नहीं है। यदि आप इसे परीक्षण स्क्रिप्ट में जोड़ते हैं तो क्या यह वही व्यवहार है? उदाहरण 1. निष्पादन सेट के साथ कुछ परीक्षण स्क्रिप्ट:, ~/bin/testing2. complete -f -X '!*.@(zip|udp)' testing, 3. testing <tab><tab>?
रनियम

@ एलेक्स: आप क्यू को आउटपुट के साथ भी अपडेट कर सकते हैं shopt...
रनियम

extglobसक्रिय होता है। 'परीक्षण' के साथ उदाहरण zipकेवल फ़ाइल को फिर से चुनता है । मैं ध्यान देता हूं कि test.zipलाल रंग में दिखाया गया है, जबकि test.updसफेद रंग में दिखाया गया है ls -l, दोनों फाइलें एक ही अनुमतियों के साथ खाली हैं, मालिकाना और समूह संघ। lsभेद क्यों करता test.zipहै test.upd? शायद यह मेरे पास मौजूद समस्या की ओर इशारा है?
एलेक्स

@ एलेक्स: एक अपडेट जोड़ा गया।
रनियम

3

फ़ाइल में /etc/bash_completion, जिसे आप संभवतः कहीं bashसोर्स कर रहे हैं, डिफ़ॉल्ट रूप से, कम से कम मेरे संस्करण के लिए (v4.2.25) है

complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk)' unzip zipinfo

संपूर्ण अभिव्यक्ति को बदलने का प्रयास करें

complete -f -X '!*.@(zip|[ejw]ar|exe|pk3|wsz|zargo|xpi|sxw|o[tx]t|od[fgpst]|epub|apk|udp)' unzip zipinfo

और अपने को जोड़ें .bash_profile


इससे मेरी समस्या हल नहीं होती। अगर मैं ऐसा करता हूं और इसे स्रोत करता हूं, unzip <tab>तो .zipन तो .updफाइल मिलती है और न ही अन्य फाइलें।
एलेक्स

दो बार टैब मारने की कोशिश करें , देखें कि क्या कोई अलग है। क्या अन्य पूर्ति अपेक्षा के अनुरूप काम करती है? फाइलों के gzipसाथ उदाहरण के लिए .gz?
bsd

दो बार टैब मारने से कुछ भी नहीं बदलता है। फ़ाइलों के gunzipसाथ उपयोग .gzकरने से केवल समाप्त होने वाली फ़ाइलों का चयन होता है .gz, लेकिन परिभाषा भी अलग है complete -F _filedir_xspec gunzip:।
एलेक्स

क्या आप फ़ाइल /etc/bash_completionको अपने स्रोत में रखते हैं .bashrc?
bsd

कोशिशshopt -s extglob
एडवर्ड फालिक

2

इस लाइन को अपने .bashrc में जोड़ने का प्रयास करें:

complete -f -o default -X '!*.+(zip|udp)' unzip

ऐसा लगता है कि इस सुझाव के साथ मुझे .udpफाइलें मिलेंगी, लेकिन केवल अगर कोई .zipफाइल मौजूद नहीं है। यदि test.zipऔर test.udpफ़ाइल वर्तमान निर्देशिका में मौजूद है, तो unzip <tab>केवल .zipफ़ाइल को सूचीबद्ध करता है। मैं दोनों फाइलों को देखना चाहता हूं (यानी बैश पूरा होगा test.)।
एलेक्स

क्या आपको यकीन है? मैंने अपने बैश पर जांच की और मुझे लगता है कि दोनों udpऔर zipफाइलें मिल सकती हैं। क्या आप .bashrcलाइन जोड़ने के बाद स्रोत थे ?
एमकेसी m ’

मैंने एक नए टर्मिनल में दोहराया, और अब unzip <tab>सभी फाइलों को सूचीबद्ध करता हूं , यहां तक ​​कि एक अलग वाक्यांश में समाप्त होता है। अब मुझे जो चाहिए वो काफी है।
एलेक्स

अजीब .. मैं GNU बैश संस्करण 4.2.25 चला रहा हूं और उम्मीद के मुताबिक काम करता हूं। आप किस संस्करण पर बैश हैं?
एमकेसी m

क्या आप दो अलग-अलग पंक्तियों को जोड़ने का प्रयास कर सकते हैं: complete -f -o default -X '!*.zip' unzipऔरcomplete -f -o default -X '!*.udp' unzip
17

1

_filedir"कच्चे" के बजाय बेहतर उपयोग करें complete

औचित्य

  • grep _filedir -r $(pkg-config --variable=completionsdir bash-completion) | wc -l
  • टिल्ड ( ~) रास्तों का विस्तार किया जा रहा है
  • निर्देशिकाओं के लिए उपसर्ग हटा दिए जाते हैं, अर्थात /home/tux/Do<TAB><TAB>, उत्तर के रूप में आपको जो सूची मिलती है वह '/ होम / टक्स' को हटा देती है और बहुत अधिक कॉम्पैक्ट होती है
  • लागू करने में आसान और अधिक विफल

मेगावाट

_unzip_completor()
{
    # init bash-completion's stuff
    _init_completion || return

    # fill COMPREPLY using bash-completion's routine
    _filedir '@(zip|udp)'
}
complete -F _unzip_completor unzip
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.