ワイルドカードを使用してLinuxコマンドを見つける方法は?および*[重複]

ワイルドカードを使用してLinuxコマンドを見つける方法は?および*[重複]

ls私のLinuxコンピュータでは、次から始まるコマンドを見つけることができます。

$ ls<TAB-key>

私はこの結果を得る

ls           lsb_release  lscpu        lshw         lsipc        lslogins     lsmod        lsof         lspcmcia     lss16toppm   
lsattr       lsblk        lsdiff       lsinitramfs  lslocks      lsmem        lsns         lspci        lspgpot      lsusb   

今、lsmod他のコマンドが何であるかを知りたいです。

私が知っている限り、次のような$ man lsmod他のコマンドがあります。

SEE ALSO
       insmod(8), modprobe(8), modinfo(8) depmod(8)

mod stringしかし、端末で使用するコマンドが見つかりませんワイルドカード。どんな状況でも達成する方法を案内してください。UnixとLinuxディストロ

ベストアンサー1

一部のシェルにはこれをサポートする機能が組み込まれています。

扱いにくい

zshシェルの自己検査組み込みコマンドの多くは、-mパターンmマッチングのための引数を使用します。これはwhence、他のシェルユーザー(cshユーザーと同じ、(標準)SysVシェルユーザー)の便宜のために提供されるコマンドとバリアントを識別し、内部ハッシュを操作するための場合(kshからのコピーと拡張)です。which標準の組み込みコマンドテーブル、コマンドパステーブルを含みます。whence -ctypewhence -vhash

whence -m '*mod*'
  type -m '*mod*'
 which -m '*mod*'
  hash -m '*mod*'

最初の3つは、組み込み関数、関数、キーワード、およびエイリアスも表示します。 forなどの-pコマンドに制限を追加します。$PATHhash

あるいは、以下を使用して、一致する実行可能ファイル$PATH$path配列にマップされている)を手動で見つけることもできます。

print -rC1 -- $^path/*mod*(DN-*)

一部の組み込みコマンドに加えて、zshは内部検査(および完了を支援するため)のためにいくつかの特殊変数にいくつかの内部状態とキャッシュデータを公開します。たとえば、コマンドのハッシュテーブルとそのパスは特殊な$commands連想配列に公開されるため、次のようにキーを表示できます。

print -rC1 -- ${(kM)commands:#*mod*}

パターンマッチングは${(M)array:#pattern}演算子を使用して行われます。

ここでは、一般的な完成に加えて、ワイルドカードの一致を試みるように完成システムを設定することもできます。たとえば、少なくとも:

zstyle ':completion:*' completer _complete _match
autoload -Uz compinit
compinit

~/.zshrc次のように入力します。

$ *mod*<Tab>

パターンに一致する可能なコマンドのリストが表示されます。しかし:

$ man -s1,8 *mod*<Tab>
Completing manual page
check-module                  mk_modmap
chmod                         modinfo
combine_lang_model            modprobe
depmod                        perlmod
dh_gtkmodules                 perlmodinstall
[...]

パート1(ユーザーコマンド)とパート8(システム管理コマンド)に含まれるマニュアルが表示されますmod

zsh初めて実行すると、newuserこれらすべてを調整できるメニューが表示されます。上記の内容は以下から確認できます。

(1)  Continue to the main menu.
[...]
(2)  Configure the new completion system.  (Recommended.)
[...]
(2)  Run the configuration tool (compinstall)
[...]
1.  Completers:  choose completion behaviour for tasks such as
    approximation, spell-checking, expansion.
[...]
m.     Set completers that modify the behaviour of the four main ones above.
[...]
1.     _ignored: Use patterns that were previously ignored if no matches so far.
2.     _list:    Only list matches until the second time you hit TAB.
3.     _oldlist: Keep matches generated by special completion functions.
4. (*) _match:   If completion fails, retry with pattern matching.
5.     _prefix:  If completion fails, retry ignoring the part after the cursor.

上から4を選択してください。しかし、もっとおいしい食べ物があるので、メニュー全体を見ることをお勧めします。

強く打つ

bashシェルでは、次のものを使用できます。

compgen -cX '!*mod*'

それは次のとおりです。

compgen -A command -X '!*mod*'

compgen -c/は、パターンに一致するコマンドを除外する意図としてcompgen -A command知られているコマンド(キーワード、エイリアス、組み込み、および機能を含む)のリストを提供しますが、で始まるパターンは除外から包含に変更されます。-X!

rcとデリバティブ

リストrcは、cshやzshなどの$path環境変数に関連付けられています。$PATH

ls -d -- $path/*mod* >[2] /dev/null

sまたはglob修飾子rcと同等のものがないため、リストは実行可能ファイルに限定されず、隠されたファイルも含まれません。zshD-*

rcBourneシェルやほとんどの派生製品と共有されるバグ機能は、一致しないglobパターンがそのまま残ることです。したがって、指定されたディレクトリに一致するものがない場合は、文句を言うリストを渡して/that/dir/*mod*この問題を解決します。名前には存在しないファイルが含まれていますが、lsBourneなどのシェルを使用してこれらのエラーを削除します。*>[2] /dev/null2> /dev/nullfish

に似ており、rc実行不可能に関する同じ警告がありますが、{.,}パターンプレフィックスを追加して隠しファイルサポートを追加します。

printf '%s\n' $PATH/{,.}*mod*

POSIX sh

POSIX shでは、次の関数を定義できます。

find_commands() (
  pattern=$1
  IFS=:; set -o noglob
  set -- $PATH''
  IFS=; set +o noglob
  for dir do
    for file in "${dir:+$dir/}"$pattern "${dir:+$dir/}".$pattern; do
      if [ -f "$file" ] && [ -x "$file" ]; then
        printf '%s\n' "$file"
      fi
    done
  done
)

次のように使用されます。

find_command '*mod*'

1$PATH空のコンポーネントがあると正しく動作しません。PATH=/bin/:/usr/bin:最後の空のコンポーネントは、現在の作業ディレクトリを見つけることを意味するためです。この問題は空です。${^path/#%/.}文字列は、他のシェルが/ディレクトリを手動で見つけるために、以下のソリューションにも同様に適用されます。.$PATH$PATH$PATH$path

おすすめ記事