$ PATHフォルダに移動し、システムで利用可能な実行可能ファイルを表示するためのスクリプト

$ PATHフォルダに移動し、システムで利用可能な実行可能ファイルを表示するためのスクリプト

これが私が今まで持っているものです:

#!/bin/bash

for file in $PATH ; do # Scanning files in $PATH

        if [ -x ] ; then #Check if executable
                echo "Executable File"
        else
                echo "Not executable"
        fi
done

出力は「ファイル実行可能」です。

すべてのフォルダを正しく繰り返さないようです。

答え1

必要なものが実行可能ファイルのリストであれば、findこれで十分です。

IFS=':'
find $PATH -type f '(' -perm -u+x -o -perm -g+x -o -perm -o+x ')'

これはリストされていますフルパスその変数の区切り文字であるコロン$PATH()で分割するIFS=':'必要があります。$PATH:

欲しくないならフルパスしかし、ただ実行ファイル名、することができます

IFS=':'
find $PATH -type f '(' -perm -u+x -o -perm -g+x -o -perm -o+x ')' -exec basename {} \; | sort

システムがfindGNUと互換性がある場合、条件ははるかに簡単です。

IFS=':'
find $PATH -type f -executable -exec basename {} \; | sort

@StephenHarrisが指摘したように、ここにはいくつかの問題があります。サブディレクトリが存在する場合、$PATHその$PATHサブディレクトリのファイルにアクセスできなくても報告されることがあります。この問題を解決するには、実際に必要POSIXに必要なものよりも多くのオプションがありますfind。この問題に対するGNU準拠のソリューションは次のとおりです。

IFS=':'
find $PATH -maxdepth 1 -type f -executable -exec basename {} \; | sort

これらのサブディレクトリに入らない-maxdepth 1ように指示します。find

答え2

一方、$PATHディレクトリのリストが提供されます。のすべてのファイルを確認するには、のすべての$PATH項目を確認するのではなく、すべてのディレクトリのすべてのファイルを確認する必要があります$PATH

次に、ファイルが実行可能であることを確認するために使用します-xが、確認するファイルを指定しませんでした。次のように変更されたバージョンを作成しました。

IFS=':'
for directory in $PATH; do
    for file in $directory/*; do
        if [ -x $file ]; then
            echo "Executable File: " $file
        else
            echo "Not executable: " $file
        fi
    done
done

Foxの答えはより良い解決策ですが、あなたはあなたの質問に興味があると思いました。

答え3

compgen特にbashの場合、組み込み機能を利用できます。

  • compgen -cTab利用可能なすべてのコマンド、組み込み機能、関数、エイリアスなどを一覧表示します(デフォルトでは、空のプロンプトでクリックしたときに表示できるもの)。
  • compgen -bすべての組み込み関数、同様のdディレクトリ、fファイル、aエイリアスなどを一覧表示します。

compgenしたがって、次の出力を使用して乱用する可能性がありますwhich

$ compgen -c | xargs which -a
/bin/egrep
/bin/fgrep
/bin/grep
/bin/ls
/bin/ping
/usr/bin/time
/usr/bin/[
/bin/echo
/bin/false
/bin/kill

compgen私の場合、最初の5つは実際にエイリアスマスキングコマンドで、次にキーワードと組み込みコマンドがあるため、出力に順序があるようです。

答え4

IFS=:; set -f;
find -- $PATH -type d -prune -exec sh -c '
cd "$1" && \
find . -type d ! -name . -prune \
           -o \
-type f \( -perm -u+x -o -perm -g+x -o -perm -o+x \) -exec echo Executable File: \{\} \; \
           -o \
-type f  ! -perm -u+x  ! -perm -g+x  ! -perm -o+x    -exec echo Not executable: \{\} \;
' {} {} \;

IFSはコロンに設定されており、PATH区切り文字とglobマッチも無効になり、PATH内の名前のglob文字の分割を防ぎます。

$ PATHは、findオプションが到着する前に分割され、主要な引数として表示されます。カタログから対応するパラメータのみを選択します。 (dirにも接続するには、-Lオプションを指定してください)。次に、このディレクトリの最初のレベルにドリルダウンして、誰か(たとえば、ユーザー/グループ/その他)が実行できるファイルをインポートします。

関連情報