現在のパスにあるすべてのファイル/バイナリを一覧表示します


10

現在のPATH内のすべてのファイル/実行可能バイナリを一覧表示するための「ls -la」スタイルのコマンドを実行する「簡単な」方法はありますか?

(私は出力をgrepにパイプして、プレフィックスは不明であるが基本的には「名前」がわかっているコマンドを探すために、bashのオートコンプリート/タブ移動が本質的に役に立たない場合の種類です。したがって、ある種の「逆オート完全な機能」...)


例を挙げていただけますか?どう違うのls -la
John Siu 2013年

"ls -la" / "ls -a"は、現在のディレクトリ(pwd)内のファイルのみを一覧表示します。PATHに含まれるすべてのディレクトリ内のすべての(実行可能)ファイルを一覧表示したい。
sme 2013年

回答:


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. 

いいですね、これは私がずっと探していたものです。現在のディレクトリに実行可能なバイナリも含まれます。ありがとう。
sme

うまく動作します... bashで。
Emanuel Berg

せずにこれらのそれぞれのパスをリストする方法はありwhich $(compgen -A function -abck)ますか?
h3rrmiller 2013年

私にはこれ以上の選択肢はありませんでした。
Nykakin 2013年

3

以下は、ディレクトリの内容をリストする関数です$PATH。引数が渡された場合、関数は、名前が引数の1つを含むコマンドのみをリストします。引数はグロブパターンとして解釈されます。

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のベース名(「末尾」)のみを保持するための履歴修飾子が続きます。

より不可解で、外部呼び出しを回避しますが、これは表面的な関心のみです。

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

実際にaproposは、短い説明にキーワードが含まれているコマンドのmanページを検索するコマンドを探している可能性があります。これは、manページがあるコマンドのみを検索するという制限です。


zsh関数では、2番目^は「引数なし」の呼び出しに対して何も出力しないように見えますか?ドロップした場合、それらすべてをリストして、単一のキーワードを検索できます(ただし、それらのリストは検索できません)。(Non:t)アスタリスクは拡大すべきであると言っているようですか?最後の1つを理解できませんでした。
Emanuel Berg

@EmanuelBergそうです、修正に感謝します。ラインノイズの説明を追加しました。
ジル 'SO-悪をやめる'

OK、見てみましょう:引数がない場合は、「them」を何も設定しません。何があったのか(何もなかった場合)、それでも、次に何をしたのか混乱したのですか?また、小文字は見たことがありませんpathが、シェルで実行すると、実際には$ PATHですが、ではなくスペースが含まれています:。残りは非常に明確です:)
エマニュエルベルク

@EmanuelBergいいえ:引数がない場合、引数の配列を空の文字列を含む1要素の配列に設定します。このように、引数がないということは、空の文字列を含むすべての名前が一致すること、つまりすべての名前が一致することを意味します。$pathはzsh機能です。これは、tieパラメータであり、更新時に自動的に更新される配列でPATH、その逆も同様です。
Gilles「SO-邪悪なことをやめ

ああ、わかりました!うわー、それは正統ではなかった!
Emanuel Berg

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" ; 
}

検索は次のものとのみ一致します。少なくとも1つの "x"(実行可能)ビットセットがあり、それはディレクトリではありません。

見つけられる正規表現のリストでそれを使用します:

findinpath awk sed '\.sh$'

正規表現 "。" すべてを表示します
Olivier Dulac 2013年

通常のIFSで、あなたがあなたの$ PATHに重複したエントリを見つけることができます:echo $PATH | tr ':' '\n' | sort | uniq -d
オリヴィエ・デュラック

1
私はすべての答えに対してコードを試しましたが、これが実際に私が探していたもの(PATH上の特定のコマンドのすべてのインスタンスへの完全パス)を与えた唯一のものです。
クリスページ

私はそれが助けてくれてうれしいです:)
Olivier Dulac '10 / 10/15

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

まず$PATH、sed にエコーし、 ":"を ""に置き換えます。

次に、それらのそれぞれについて検索を実行して、rwxでファイルを検索し、それらをエコーし​​ます。

2> /dev/nullですので、findエラーを印刷しません


3
あなたが必要-maxdepth 1-type fあなたの検索では、他のあなたは(検索ではないであろうPATH)のサブディレクトリとそのファイルを見つけることができます。また、あなたの許可テストは奇妙です—のためだけにすべき+xですか?
derobert 2013年

有効な空白のエントリが同じであるた「」これは、例えば、エッジケースを処理しません:/bin/bin::/usr/bin。コマンドに追加s/::/:.:/;s/^:/.:/;s/:$/:./してみてくださいsed
Arcege 2013年

実際にfindはより多くのパスを検索できるので、ループなしで実行できます。find $(echo $PATH | sed -e 's/\:/\ /g') -perm +rwx …もちろん、スペースを含むディレクトリ名はめちゃくちゃになりますが、ループベースのパスでも同じ問題が発生します。
manatwork 2013年

あなたが正しい@manatwork。この問題を解決するために引用を追加しました
h3rrmiller 2013年

それは何も解決しません。問題は、コロンをスペースに置き換えて単語を分割できるようにすることです。したがって、「/ foo bar:/ fiz baz」を「/ foo bar / fiz baz」に変換し、それをに渡しforます。したがってfor、4ワードのリストをループします。単語分割を操作するIFSには、必要に応じてを設定しますIFS=':'; find $PATH -perm +rwx …
manatwork 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.