বর্তমান PATH- এ সমস্ত ফাইল / বাইনারি তালিকাবদ্ধ করুন


10

বর্তমান PATH- এ সমস্ত ফাইল / এক্সিকিউটেবল বাইনারিগুলি তালিকাভুক্ত করার জন্য "ls -la" স্টাইল কমান্ড চালানোর কোন "সহজ" উপায় আছে?

(আমি অজানা উপসর্গের সাথে কমান্ড সন্ধান করার জন্য মূলত পরিচিত "নাম" সন্ধানের জন্য আউটপুটটি গ্রেপে পাইপ করার ইচ্ছা করি, যখন ব্যাশে স্বয়ংক্রিয়ভাবে সমাপ্তি / ট্যাবিং মূলত অকেজো হয় তবে এই ধরণের ক্ষেত্রে সম্পূর্ণ বৈশিষ্ট্য "...)


আপনি উদাহরণ দিতে পারেন? এর সাথে কীভাবে আলাদা হবে 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

এর চেয়ে ভাল বিকল্প আর খুঁজে পেলাম না।
নাইকাকিন

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
}

^চরিত্রের প্যারামিটার সম্প্রসারণ টেক্সট অ্যারের সঙ্গে ঘনিভূত প্রতিটি অ্যারের উপাদান, যেমন যোগ করা কারণ path=(/bin /usr/bin); echo $^path/fooকপি করে প্রিন্ট /bin/foo /usr/bin/foo
/*$^@*একটি কমিক বইয়ের অপমানের মতো দেখায় তবে এটি সাধারণ চরিত্র /, ওয়াইল্ডকার্ড *, বিশেষ পরামিতি $@(অবস্থানের প্যারামিটারের অ্যারে) ^সংশোধক সহ এবং আবার *
(N:t)হয় উল্লিখিত glob কোয়ালিফায়ার N যদি কোনো মিল দ্বারা অনুসরণ একটি খালি সম্প্রসারণ পেতে ইতিহাস পরিবর্তক t প্রতিটি ম্যাচের শুধুমাত্র basename ( "লেজ") রাখা।

আরও ক্রিপ্টিক, বাহ্যিক কল এড়ায় তবে এটি কেবল প্রসাধনী আগ্রহের বিষয়:

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

আপনি সম্ভবত aproposকমান্ডটি সন্ধান করছেন, যা কমান্ডের ম্যান পেজগুলি অনুসন্ধান করে যার সংক্ষিপ্ত বিবরণটিতে একটি কীওয়ার্ড রয়েছে। একটি সীমাবদ্ধতা হ'ল এটি কেবল সেই আদেশগুলি সন্ধান করে যা ম্যান পৃষ্ঠা রয়েছে।


Zsh ফাংশনে, দ্বিতীয়টি ^"কোনও আর্গুমেন্ট" কলের ফলাফল দেয় না বলে মনে হচ্ছে? আপনি যদি এটিকে ফেলে দেন তবে আপনি সেগুলি সব তালিকাভুক্ত করতে পারেন এবং তবুও একক কীওয়ার্ড অনুসন্ধান করতে পারেন (তবে সেগুলির একটি তালিকা নয়)। (Non:t)বলতে চাই যে আস্টেরিক্স প্রসারিত করা উচিত বলে মনে হয়? শেষ যে খুঁজে বের করতে পারেনি।
ইমানুয়েল বার্গ

ইমেনুয়েলবার্গ ঠিক আছে, ঠিক করার জন্য ধন্যবাদ। আমি লাইন গোলমালের একটি ব্যাখ্যা যুক্ত করেছি।
গিলস

ঠিক আছে, দেখা যাক: যদি কোনও যুক্তি না থাকে তবে আপনি "সেগুলি" কিছুই নির্ধারণ করেন নি, কারণ সেখানে যা ছিল (যখন সেখানে কিছুই ছিল না) তখনও আপনি পরবর্তী কাজগুলি কোনওভাবে বাধাগ্রস্ত করেছিলেন? এছাড়াও, আমি ছোট হাতের অক্ষরটি কখনও দেখিনি path, তবে আমি যখন এটি শেলের মধ্যে চালাই, এটি সত্যিই AT PATH তবে পরিবর্তে ফাঁকা স্থান সহ :। বাকিগুলি স্ফটিক পরিষ্কার :)
ইমানুয়েল বার্গ

@ ইমানুয়েলবার্গ নং: যদি কোনও আর্গুমেন্ট না থাকে তবে আমি আর্গুমেন্টের অ্যারেটিকে খালি স্ট্রিং সহ এক-এলিমেন্ট অ্যারে হিসাবে সেট করি। এইভাবে, কোনও আর্গুমেন্টের অর্থ প্রতিটি খালি খালি স্ট্রিং মিল থাকে, অর্থাত প্রতিটি নামের সাথে মিল রয়েছে matches $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" ; 
}

অনুসন্ধানগুলি কেবল এটির সাথে মেলে: কমপক্ষে একটি "এক্স" (এক্সিকিউটেবল) বিট সেট রয়েছে এবং এটি কোনও ডিরেক্টরি নয়।

এবং এটি পাওয়া regexp একটি তালিকা সহ এটি ব্যবহার করুন:

findinpath awk sed '\.sh$'

regexp "।" আপনাকে সবকিছু দেখাবে
অলিভিয়ার ডুলাক

নিয়মিত আইএফএসের সাহায্যে আপনি আপনার $ পথের মধ্যে নকল এন্ট্রিগুলি এর সাথে পেতে পারেন: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

প্রথমে আমরা সেডে প্রতিধ্বনিত করি $PATHএবং ":" সাথে "" প্রতিস্থাপন করি।

তারপরে আমরা rwx সহ ফাইলগুলি খুঁজতে এবং সেগুলি প্রতিধ্বনি করার জন্য সেই সমস্ত জিনিসের একটিতে অনুসন্ধান করি।

2> /dev/nullতাই findত্রুটি মুদ্রণ করবে না


3
আপনার একটি দরকার -maxdepth 1এবং -type fআপনার সন্ধানের প্রয়োজন , অন্যথায় আপনি উপ-ডিরেক্টরি এবং তাদের ফাইলগুলি খুঁজে পাবেন (যা PATH অনুসন্ধান করবে না)। এছাড়াও, আপনার অনুমতি পরীক্ষাটি অদ্ভুত just কেবলমাত্র উচিত +x, আমি ভাবি?
ডারোবার্ট

এটি প্রান্তের কেসগুলি হ্যান্ডেল করবে না যেমন বৈধ ফাঁকা প্রবেশ '' এর সমান হয়, উদাহরণস্বরূপ :/binবা /bin::/usr/bin। কমান্ড যুক্ত s/::/:.:/;s/^:/.:/;s/:$/:./করার চেষ্টা করুন sed
আর্জেজ

প্রকৃতপক্ষে findআরও পাথ সন্ধান করতে পারে, সুতরাং আপনি এটি লুপ ছাড়াই করতে পারেন: find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …অবশ্যই স্পেসিসভুক্ত ডিরেক্টরির নামগুলি এটিকে বিঘ্নিত করবে, তবে লুপ ভিত্তিক যেকোনোভাবে একই সমস্যা রয়েছে।
manatwork

@ মান্যাটওয়ার্ক আপনি ঠিক বলেছেন আমি এখনই এই সমস্যাটি সমাধান করার জন্য উদ্ধৃতি যুক্ত করেছি
h3rrmiller

দুঃখিত, এটি কিছুই সমাধান করে না। শব্দের বিভক্তকরণের অনুমতি দেওয়ার জন্য সমস্যাটি স্থানগুলি দিয়ে কলোনগুলি প্রতিস্থাপনের সাথে রয়েছে। সুতরাং আপনি “/ foo বার: / fiz বাজ” কে “/ foo বার / ফিজ বাজ” রূপান্তর করুন তারপরে এটি পাস করুন for। সুতরাং for4 টি শব্দের একটি তালিকাতে লুপ হবে। নিপূণভাবে শব্দ বিভাজন ভাল সেট IFSআপনার প্রয়োজন অনুযায়ী: IFS=':'; find $PATH -perm +rwx …
manatwork
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.