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
:標準入力から受け取ったすべてのファイルの名前に変更します。これらのファイルはすべて次の式に一致するものを検索し、ファイルのいずれかがディレクトリの場合はその内容も確認します。locate
find
-prune
:評価中のファイル名がディレクトリに属している場合は、その内容を検索しないでください。-type f
:デバイス、名前付きパイプなどの特殊ファイル名ではなく、「一般」ファイルであるファイル名のみが出力に含まれます。-executable
:出力には実行可能ファイルのファイル名のみが含まれています。つまり、ファイルの内容に関係なく、1つ以上の実行モードビットがセットされる。
つまり、locate
一致するファイルの名前を標準出力として印刷し、それを|
標準入力としてパイプ(使用)しますxargs
。xargs
標準入力からファイル名を読み取り、単一の文字列のスペースで区切られたリストに結合します。文字列が空でない場合は、コマンドを実行する前にコマンドの文字列を置き換えてくださいxargs
。{}
find
答え3
短い答えはGNU検索を使用してください。
find / -type f -executable -name '*gtags*'