वर्तमान PATH में सभी फाइलों / बायनेरिज़ की सूची बनाएं


10

क्या वर्तमान बीएटीएच में सभी फाइलों / निष्पादन योग्य बायनेरिज़ को सूचीबद्ध करने के लिए "एलएस-बाला" शैली कमांड चलाने का एक "आसान" तरीका है?

(मैं अज्ञात उपसर्गों के साथ कमांड की तलाश में, लेकिन मूल रूप से ज्ञात "नाम" के लिए grep में आउटपुट को पाइप करने का इरादा रखता हूं, जिस तरह का मामला है जब ऑटो-पूरा / बैश में टैब करना अनिवार्य रूप से बेकार है। तो किसी प्रकार का "इनवॉइस ऑटो"। पूरी सुविधा "...)


क्या आप उदाहरण दे सकते हैं? इसके साथ कैसे अलग होगा ls -la?
जॉन सियु

"ls -la" / "ls -a" केवल आपकी वर्तमान निर्देशिका (pwd) में फ़ाइलें सूचीबद्ध करता है। मैं PATH में शामिल सभी निर्देशिकाओं में सभी (निष्पादन योग्य) फाइलों को सूचीबद्ध करना चाहता हूं।
एसएमई

जवाबों:


19
compgen -c # will list all the commands you could run.
compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go. 

अच्छा, यह बहुत ज्यादा है जो मैं ढूंढ रहा हूं। इसमें वर्तमान निर्देशिका में निष्पादन योग्य बायनेरी भी शामिल हैं। धन्यवाद।
एसएमई

अच्छी तरह से काम करता है ... बैश में।
इमानुएल बर्ग

क्या बिना किए इनमें से प्रत्येक के मार्ग को सूचीबद्ध करने का कोई तरीका है which $(compgen -A function -abck)?
h3rrmiller

मुझे कोई बेहतर विकल्प नहीं मिला।
Nyakakin

3

यहां एक फ़ंक्शन है जो निर्देशिकाओं की सामग्री को सूचीबद्ध करता है $PATH। यदि तर्कों को पारित किया जाता है, तो फ़ंक्शन केवल उन कमांड को सूचीबद्ध करता है जिनके नाम में से एक तर्क दिया गया है। तर्कों की व्याख्या ग्लोब पैटर्न के रूप में की जाती है।

shopt -s extglob
lspath () {
  local IFS pattern
  IFS='|'
  pattern="*@($*)*"
  IFS=':'
  for d in $PATH; do
    for x in "$d/"$pattern; do
      [ "$x" = "$d/$pattern" ] || echo "${x##*/}"
    done
  done | sort -u
}

कई चीजों की तरह, यह zsh में आसान है।

lspath () {
  (($#)) || set ''
  print -lr -- $^path/*$^@*(N:t) | sort -u
}

^में चरित्र पैरामीटर विस्तार पाठ सरणी साथ concatenated प्रत्येक सरणी तत्व, जैसे के लिए जोड़ा जा करने के लिए कारण बनता है path=(/bin /usr/bin); echo $^path/fooप्रिंट /bin/foo /usr/bin/foo
/*$^@*एक कॉमिक बुक अपमान की तरह लगता है, लेकिन वास्तव में साधारण चरित्र /, वाइल्डकार्ड *, विशेष पैरामीटर $@(स्थितीय पैरामीटर का सरणी) ^संशोधक के साथ , और फिर से है *। प्रत्येक मैच का केवल आधार ("पूंछ") रखने के लिए इतिहास संशोधक के बाद कोई मैच नहीं होने पर खाली विस्तार पाने के
(N:t)लिए ग्लोब क्वालिफायर N है । t

अधिक गुप्त, बाहरी कॉल से बचता है, लेकिन यह केवल कॉस्मेटिक रुचि है:

lspath () {
  (($#)) || set ''
  local names; names=($^path/*$^@*(N:t))
  print -lr -- ${(ou)names}
}

आप वास्तव में aproposकमांड की तलाश में हो सकते हैं , जो उन कमांड पेजों को खोजता है जिनके संक्षिप्त विवरण में एक कीवर्ड होता है। एक सीमा यह है कि यह केवल उन कमांड्स को खोजता है जिनमें एक मैन पेज है।


Zsh फ़ंक्शन में, दूसरा ^"कोई तर्क नहीं" कॉल के लिए आउटपुट में नहीं लगता है? यदि आप इसे छोड़ देते हैं, तो आप उन सभी को सूचीबद्ध कर सकते हैं, और फिर भी एकल कीवर्ड खोज सकते हैं (लेकिन उनकी सूची नहीं)। ऐसा (Non:t)लगता है कि तारांकन का विस्तार किया जाना चाहिए? यह पता नहीं लगा सका कि पिछले एक ने क्या किया था।
इमानुएल बर्ग

@EmanuelBerg सही, फिक्स के लिए धन्यवाद। मैंने लाइन शोर का स्पष्टीकरण जोड़ा है।
गिल्स एसओ- बुराई को रोकना '

ठीक है, देखते हैं: यदि कोई तर्क नहीं है, तो आप कुछ भी नहीं करने के लिए "उन्हें" सेट करते हैं, क्योंकि वहाँ क्या था (जब कोई नहीं था), फिर भी किसी भी तरह से विघटनकारी था कि आपने आगे क्या किया? इसके अलावा, मैंने कभी लोअरकेस नहीं देखा है path, लेकिन जब मैं इसे शेल में चलाता हूं, तो यह वास्तव में $ PATH है, लेकिन इसके बजाय रिक्त स्थान के साथ :। बाकी क्रिस्टल स्पष्ट है :)
इमानुएल बर्ग

@EmanuelBerg नहीं: यदि कोई तर्क नहीं है, तो मैं खाली स्ट्रिंग वाले एक-तत्व सरणी होने के लिए तर्कों की सरणी सेट करता हूं। इस तरह, कोई भी तर्क का अर्थ नहीं है कि प्रत्येक नाम खाली स्ट्रिंग मैचों से मेल खाता है, अर्थात प्रत्येक नाम से मेल खाता है। $pathएक zsh सुविधा है: यह एक बंधा हुआ पैरामीटर है , एक सरणी जो अद्यतन होने पर स्वचालित रूप से अपडेट की जाती PATHहै और इसके विपरीत।
गिल्स एसओ- बुराई को रोकना '

अहा, अब मैं देखता हूं! वाह, यह अपरंपरागत था!
इमानुएल बर्ग

1
function findinpath () { 
   OLDIFS="$IFS" ; 
   IFS="$(printf ':\t\n')" ; 
   for regexp in "$@" ; do 
      for adir in $PATH ; do 
         find "$adir" -perm -111 -a ! -type d -ls 2>/dev/null | grep -i "/[^/]*$regexp"
      done ; 
   done ; 
   IFS="$OLDIFS" ; 
}

खोज केवल उसी से मेल खाती है: कम से कम एक "x" (निष्पादन योग्य) बिट सेट है, और यह एक निर्देशिका नहीं है।

और पाया जा regexp की एक सूची के साथ इसका उपयोग करें:

findinpath awk sed '\.sh$'

regexp "।" आपको सब कुछ दिखाएगा
ओलिवियर दुलाक

नियमित IFS के साथ, आप अपने $ PATH में डुप्लिकेट प्रविष्टियाँ पा सकते हैं:echo $PATH | tr ':' '\n' | sort | uniq -d
ओलिवियर दुलैक

1
मैंने सभी उत्तरों के लिए कोड की कोशिश की और यह केवल वही है जो वास्तव में मुझे दिया गया था जो मैं देख रहा था (पथ पर दिए गए कमांड के हर उदाहरण के लिए पूर्ण पथ)।
क्रिस पेज

मुझे खुशी है कि यह मदद मिली :)
ओलिवियर दुलैक

1
for i in $(echo $PATH | sed -e 's/\:/\ /g'); do find "$i" -perm +rwx -exec echo {} \; 2> /dev/null; done

पहले हम $PATHsed में गूंजते हैं और ":" के साथ "" को प्रतिस्थापित करते हैं।

फिर हम उन चीजों में से प्रत्येक पर एक खोज करते हैं जो कि rwx के साथ फाइलें ढूंढती हैं और उन्हें प्रतिध्वनित करती हैं।

2> /dev/nullइतनी findगलतियाँ प्रिंट नहीं होंगी


3
आप एक की जरूरत है -maxdepth 1और -type fअपने खोज में है, और आप उपनिर्देशिकाएं और उनकी फ़ाइलों को (जो पथ खोज नहीं होगा) मिल जाएगा। इसके अलावा, आपकी अनुमति परीक्षण अजीब है - क्या +xमुझे लगता है कि चाहिए?
derobert

यह संभाल नहीं करेगा कि किनारे के मामले एक वैध रिक्त प्रविष्टि थे, जैसे कि ''।, उदाहरण के लिए :/binया /bin::/usr/bin। कमांड में जोड़ने s/::/:.:/;s/^:/.:/;s/:$/:./का प्रयास करें sed
23

वास्तव में findअधिक पथ खोज सकते हैं, इसलिए आप इसे लूप के बिना कर सकते हैं: find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …बेशक, रिक्त स्थान वाले निर्देशिका नाम इसे गड़बड़ कर देंगे, लेकिन लूप आधारित एक ही समस्या वैसे भी है।
14

@manatwork तुम सही हो। मैंने उस मुद्दे को अभी हल करने के लिए उद्धरण जोड़े
hrrrmiller

क्षमा करें, यह कुछ भी हल नहीं करता है। समस्या शब्दों को विभाजित करने की अनुमति देने के लिए रिक्त स्थान के साथ कॉलनों को बदलने के साथ है। तो आप "/ foo bar: / fiz baz" को "/ foo bar / fiz baz" में रूपांतरित करें और फिर उसे पास करें for। तो for4 शब्दों की सूची पर लूप होगा। शब्द विभाजन में हेरफेर करने के IFSलिए अपनी आवश्यकता के अनुसार बेहतर सेट करें IFS=':'; find $PATH -perm +rwx …:।
मैनटवर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.