「検索」を使用して実行可能ファイルのみを検索するには?

「検索」を使用して実行可能ファイルのみを検索するには?

locate gtagsという名前のすべてのファイルを見つけますgtags

実行可能ファイルのみが必要な場合はどうすればよいですか?これを行う方法はありますか?

答え1

簡単なことではありません。あなたはそれを使用することができます

locate bash | while IFS= read -r line; do [[ -x "$line" ]] && echo $line; done

名前に含まれるすべての実行可能ファイルを見つけますbash。これはfindいくつかのファイルをチェックするだけで、ファイルシステム全体を使用するよりも高速です。


  • locate bash常に行うことを行います(一致するすべての項目を一覧表示)。
  • |(パイプ)は最初のコマンド()の出力を取得locateし、2番目のコマンド(行の残りの部分)に送信します。
  • ループはwhile ...; do ... doneパイプからlocate受信した各行を繰り返します。
  • read -r line入力行を読み、それをline(この場合はパス/ファイル名)という変数に保存します。
  • [[ -x "$line" ]]ファイルが$line実行可能かどうかをテストする
  • その場合、&& echo $lineウィジェットはそれを画面に印刷します。

答え2

最速かつ安価なソリューション:

locate -b '\gtags' | xargs -ri find {} -prune -type f -executable

xargsマニュアルページによると、上記の構文は、見つかったすべてのファイル名を、指定されたファイルのみを検証するlocate単一の実行に渡します。find

このソリューションは、次の理由で以前に提供されたソリューションよりも優れています。

  • findルートディレクトリから始めて、システム内のすべてのファイルを検索するための短いコマンドですが、実行に時間がかかることがあります。
  • シェル while ループを使用して各ファイル名を解決すると、各ファイルを一度に 1 つずつ確認するため、速度が遅くなる可能性があります。

他の人が以前の回答で提供されたパラメータの詳細な説明を要求したので、詳細は次のとおりです。

  • locate(望むより:通話場所の検索 - ファイルの検索)
    • -b:パス名のディレクトリ名に関係なく、指定されたパターンを持つパス名のデフォルトのファイル名のみが一致します。
    • \:バックスラッシュはワイルドカードなので、パターンはlocate考慮gtagsされません*gtags*。つまり、前後に他の文字がなく、正確な名前が「gtags」のファイルを探します。
  • xargs(望むより:xargs オプション - ファイルの検索)
    • -r:標準入力が完全に空の場合、コマンドは実行されません。
    • -i:{}次のコマンドを標準入力から読み取ったファイル名のリストに置き換えます。
  • find(望むより:マスターインデックスの検索 - ファイルの検索)
    • {}xargs:標準入力から受け取ったすべてのファイルの名前に変更します。これらのファイルはすべて次の式に一致するものを検索し、ファイルのいずれかがディレクトリの場合はその内容も確認します。locatefind
    • -prune:評価中のファイル名がディレクトリに属している場合は、その内容を検索しないでください。
    • -type f:デバイス、名前付きパイプなどの特殊ファイル名ではなく、「一般」ファイルであるファイル名のみが出力に含まれます。
    • -executable:出力には実行可能ファイルのファイル名のみが含まれています。つまり、ファイルの内容に関係なく、1つ以上の実行モードビットがセットされる。

つまり、locate一致するファイルの名前を標準出力として印刷し、それを|標準入力としてパイプ(使用)しますxargsxargs標準入力からファイル名を読み取り、単一の文字列のスペースで区切られたリストに結合します。文字列が空でない場合は、コマンドを実行する前にコマンドの文字列を置き換えてくださいxargs{}find

答え3

短い答えはGNU検索を使用してください。

find / -type f -executable -name '*gtags*'

関連情報