使用通配符搜索命令

使用通配符搜索命令

我做了一些研究,但不幸的是我的问题从未得到解答。与我最接近的问题是:搜索 bash 命令

我需要什么:搜索命令已安装使用通配符的命令。假设我想卸载某些东西但忘记了命令。我知道它包含“安装”。所以我会做这样的事情:

searchfor *mount*

找到这unmount就是我需要的命令。我知道man -k或者yum whatprovides。但这不是我要找的。我想搜索所有已安装命令(可以在变量提供的目录中找到$PATH)。

答案1

我最喜欢的方法是使用compgen -c.例如,要查找包含以下内容的所有命令mount

$ compgen -c | grep mount
gvfs-mount
mmount
ideviceimagemounter
grub-mount
humount
hmount
umount
mountpoint
mount
fusermount
umount
mount.ntfs
mount.lowntfs-3g
mount.cifs
umount.udisks
mount.nfs
umount.nfs
mount
mount.ntfs-3g
mount.fuse
showmount
rpc.mountd
mountesp
umount.udisks2
mountstats
automount

好处是compgen -c它还可以查找别名、用户函数和 Bash 内置命令,例如:

$ alias aoeuidhtn='echo hi'
$ compgen -c | grep aoeuidhtn
aoeuidhtn
$ my-great-function() { printf "Inside great function()\n"; }
$ compgen -c | grep great
my-great-function
$ compgen -c | grep '^cd$'
cd

此外,compgen它是 Bash 的一部分,因此始终可用。正如所描述的help compgen

根据选项显示可能的完成情况。

旨在在生成可能的完成的 shell 函数内使用。如果提供了可选的 WORD 参数,则会生成针对 WORD 的匹配项。

退出状态:
返回成功,除非提供了无效选项或发生错误。

答案2

#! /bin/bash
s=$1  # e.g. mount
IFS=:
for p in $PATH ; do
    ls "$p/"*"$s"* 2>/dev/null
done

设置$IFS:可以for正确迭代 的成员$PATH。将 stderr 重定向到 /dev/null 会隐藏不包含匹配项的目录的错误消息。

答案3

它可以通过多种不同的方式完成,在 $PATH 路径中查找,使用locate 命令等。

查找 $(echo $PATH|tr ':' ' ') -max深度 1 -name '*mount*'

答案4

这是基于乔罗巴的回答,但仅使用 Bash 功能(为 GNU Bash 4.3.11 编写)。如果找到任何匹配项,则返回成功,否则返回失败。

#!/bin/bash
shopt -s nullglob
s="${1:?}"  # Error if argument is missing or null.
exit=1  # Return failure unless changed.
IFS=:
for p in $PATH; do
    for f in "$p/"*"$s"*; do
        if [[ -f $f ]]; then
            echo "$f"
            exit=0  # Return success since match found.
        fi
    done
done
exit $exit

相关内容