如何使用通配符查找Linux命令?和*

如何使用通配符查找Linux命令?和*

在我的 Linux 机器中,我可以找到以lsby开头的命令

$ 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

一些 shell 对此有内置支持。

桀骜

许多zshshell 的自省内置命令都采用-m参数来进行模式m匹配。这是(从 ksh 复制和扩展)的情况,whence用于识别为方便其他 shell 用户而提供的命令和变体(与 csh 用户which相同, (标准)与 SysV shell 用户相同)以及用于操作内部哈希的标准内置命令表,包括命令路径的表。whence -ctypewhence -vhash

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

前 3 个还查看内置函数、函数、关键字、别名;添加-p对命令的限制,$PATH如 for hash

或者您可以使用以下命令手动查找匹配的可执行文件$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。但我强烈建议您浏览所有菜单,因为那里还有更多好吃的东西。

巴什

bashshell 中,您可以使用:

compgen -cX '!*mod*'

与...一样:

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

compgen -c/compgen -A command给出已知命令的列表(包括关键字、别名、内置命令和函数),-X目的是排除那些与某个模式匹配的命令,但以 开头的该模式!将从排除更改为包含。

rc 和导数

在 中rc$path列表与环境变量相关联,$PATH如 csh 或 zsh 中,

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

请注意,它rc没有相当于zshsD-*glob 限定符,因此该列表不限于可执行文件,也不包含隐藏文件。

rc与 Bourne shell 及其大多数衍生产品共享一个错误功能,即不匹配的 glob 模式保持原样,因此如果给定目录中没有匹配项,我们将得到一个文字/that/dir/*mod*.我们通过传递列表来解决这个问题,该列表抱怨名称中ls包含那些不存在的文件,但使用(与类似 Bourne 的 shell 或相同)丢弃这些错误*>[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目录的其他 shell 的解决方案。

答案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

使用aproposfrom mandb(常见于基于 Linux 的系统),

apropos mod

将返回名称或摘要与正则表达式匹配的手册页条目mod(请注意,这与 shell glob 通配符模式不同),即它包含mod.

您还可以指定要查看的部分或部分列表。

要仅在名称而不是摘要中查找mod,您可以利用以下事实:页面名称几乎不包含空格,而摘要几乎总是包含空格。

所以:

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

应返回第 1 节和第 8 节中的手册页,其姓名包含mod,因为正则表达式匹配主语 ( ) 的开头,后跟除空格 ( )之外^的任意数量 ( ) 的字符,后跟除空格 ( ) 之外的任意数量 ( ) 的字符,后跟主题的结尾主题 ( ),所以简而言之,它周围没有任何空格。*[^ ]mod*[^ ]$mod

相关内容