如何在 bash 中实现类似于 apt search 的搜索

如何在 bash 中实现类似于 apt search 的搜索

我正在编写一个 bash 脚本,它是一个“包管理器”,它使用pi 应用程序
我想实现一个搜索功能,以便我可以搜索应用程序。现在我正在做的是这样的(模板是一个我不想列出的文件夹):

#test-search.sh

PI_APPS_DIR="$HOME/pi-apps"

function list-all() {
    for dir in $PI_APPS_DIR/apps/*/; do
        dirname=$(basename "$dir")
        if [[ "$dirname" != "template" ]]; then
            echo -e "\n${bold}${inverted}${light_blue}$dirname${normal}"
            DESC="${green}$(cat "$dir"/description)${normal}"
            echo -e $DESC
        fi
    done
}

function search() {
    for dir in $PI_APPS_DIR/apps/*/; do
        dirname=$(basename "$dir")
        if [[ "$dirname" != "template" ]]; then
            echo "$dirname" | grep "$1"
        fi
    done
}


# the function is then called like this
if [[ "$1" == "search" ]]; then
    #search a app
    FIND="$(search "$2")"
    list-all | grep "$FIND"
fi

并像这样运行它:(./test-search.sh search "APP"应用程序是搜索词)。

发生的情况是这样的:如果搜索术语位于应用程序的名称及其描述中,我会得到如下内容:

./test-search.sh search "Q"
QEMU
description.......

但如果我使用q,它只会列出所有应用程序。如果搜索词仅出现在应用程序的描述中,则仅打印描述。

文件树如下所示:

~/pi-apps/apps例如,apps每个应用程序都有一个名为应用程序名称的文件夹 。Zoom有 1 个名为template我不想列出的文件夹。

这是其他人用 python 编写的同一个项目:https://github.com/techcoder20/PiAppsTerminalAdvanced/blob/main/PiAppsTerminalAdvanced.py我认为这有助于理解我想做什么。

答案1

我希望这可以被接受作为答案。

你的算法应该是:

  1. 查找名称包含搜索字符串的目录。如果找到,则打印目录名称和cat相应的描述。

例如:

for dir in *${SEARCHSTRING}*
do
  echo $dir
  cat "$dir/description"
done
  1. 在所有其他目录中,找到描述包含搜索字符串。如果找到,请参见上文。

例如:

for dir in *
do
  if [[ $dir != *${SEARCHSTRING}* ]]
  then 
    if grep -q "$SEARCHSTRING"
    then 
      echo $dir
      cat "$dir/$SEARCHSTRING"
    fi
  fi
done

这两个循环可以毫不费力地合二为一。注意:我只是将它们放在一起,没有进行测试,也没有使它们适应您现有的程序。

你的算法是什么实际上做:

  1. 查找包含搜索字符串的目录。然后cat 全部描述并 grep 查找该搜索的结果,即使该结果为空。至少有两个不良后果: 当搜索不存在的目录时,所有内容都会被打印。此外,仅打印包含搜索字符串的描述行。
  2. 您没有解决描述(而不是目录)包含搜索字符串的情况。

这不能通过更改一两行来解决。我认为需要重新设计。

相关内容