ワイルドカードを使用して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

答え2

# in at least bash
start cmd:> ( IFS=: ; find $PATH -type f -name 'ls*' -perm /111 -ls )
    96723      4 lrwxrwxrwx   1 root     root            4 Mär 19 23:08 /usr/bin/lsmod -> kmod
   281915      4 lrwxrwxrwx   1 root     root           11 Mär 19 22:35 /usr/bin/lsb-release -> lsb_release
   733984      4 -rwxr-xr-x   1 root     root         2479 Mär 20 05:53 /usr/bin/lss16toppm
   734097      4 -rwxr-xr-x   1 root     root         1821 Mär 19 22:36 /usr/bin/lsdev
   955869     12 -rwxr-xr-x   1 root     root        10514 Mär 19 22:35 /usr/bin/lsb_release
  1070923     16 -rwxr-xr-x   1 root     root        14215 Mär 20 00:13 /usr/bin/lsusb.py
  1245610    136 -rwxr-xr-x   1 root     root       138016 Apr  1 19:45 /usr/bin/ls
  1254310    104 -rwxr-xr-x   1 root     root       104632 Apr  1 21:16 /usr/bin/lscpu
  1254311     76 -rwxr-xr-x   1 root     root        73928 Apr  1 21:16 /usr/bin/lsfd
  1254312     52 -rwxr-xr-x   1 root     root        51384 Apr  1 21:16 /usr/bin/lsipc
  1254313     28 -rwxr-xr-x   1 root     root        26808 Apr  1 21:16 /usr/bin/lsirq
  1254314     32 -rwxr-xr-x   1 root     root        31304 Apr  1 21:16 /usr/bin/lslocks
  1254315     40 -rwxr-xr-x   1 root     root        39096 Apr  1 21:16 /usr/bin/lsmem
  1254316     40 -rwxr-xr-x   1 root     root        39096 Apr  1 21:16 /usr/bin/lsns
  1254878    136 -rwxr-xr-x   1 root     root       137400 Apr  1 21:22 /usr/bin/lsblk
  1254879     52 -rwxr-xr-x   1 root     root        51384 Apr  1 21:22 /usr/bin/lslogins
  1255279     84 -rwxr-xr-x   1 root     root        85136 Mär 19 22:34 /usr/bin/lsscsi
  1255280    176 -rwxr-xr-x   1 root     root       179912 Mär 19 22:50 /usr/bin/lsof
  1258862   2980 -rwxr-xr-x   1 root     root      3048800 Mär 20 06:13 /usr/bin/lsar
  1264433     16 -rwxr-xr-x   1 root     root        14456 Mär 19 22:35 /usr/bin/lsattr
  1264457     12 -rwxr-xr-x   1 root     root        11989 Mär 20 04:18 /usr/bin/lsinitrd
  1271261    104 -rwxr-xr-x   1 root     root       106376 Mär 19 23:14 /usr/bin/lspci
  1272752    252 -rwxr-xr-x   1 root     root       256328 Mär 20 00:13 /usr/bin/lsusb

答え3

マニュアルページを検索するには(多くの実装と同様にapropos)、すべてのマニュアルページとその要約のインデックスに対していくつかの正規表現マッチングを実行する方法を使用できます。man -kman

apropos以下で使用mandb(Linuxベースのシステムで一般的)、

apropos mod

名前または要約が正規表現に一致するマニュアルページエントリを返しますmod(これはシェルグロブワイルドカードパターンとは異なります)。つまり、mod

表示するセクションまたはセクションのリストを指定することもできます。

緑ではなく名前だけを検索するには、ページmod名にスペースはほとんど含まれていませんが、緑にはほとんど常にスペースが含まれているという事実を利用できます。

だから:

apropos -s1,8 '^[^ ]*mod[^ ]*$'

セクション1と8のマニュアルページを返す必要があります。名前mod含まれています。正規表現は、タイトル()の始まり、^スペース()を除くすべての数字()文字、スペース()を除くすべての数字()文字、タイトルの終わり()と一致するために含まれます。一言で言えば、周りにスペースはありません。*[^ ]mod*[^ ]$mod

関連情報