shell 根据单词的每个字符查找文件夹路径,并对选定文件使用grep

kcrjzv8t  于 2022-12-13  发布在  Shell
关注(0)|答案(1)|浏览(107)

我想运行下面的代码,并使用grep在一个路径尚未确定的文件中搜索“LARGE_NAME”。

  • 文件名和文件夹名都是字母表[a-z]中的一个不同字母;
  • 文件没有文件扩展名。例如:“$dir/$letter1/$letter2”,$letter2是文件;
  • 如果没有更多要搜索的子文件夹,我知道我找到了路径。

./query.sh LARGE_NAME

最终文件可能位于:

$dir/$letter1
$dir/$letter1/$letter2
$dir/$letter1/$letter2/$letter3/
.... so on

其中:

$letter1 = L
$letter2 = A
$letter3 = R
.... so on

我想优化我的代码,工作,但有太多的嵌套IF。下面是一个例子,只有3个字母的搜索:
query.sh 档案:

#!/opt/homebrew/bin/bash
dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

letter1=$(echo ${1,,}|cut -b1)
if [ -f "$dir/$letter1" ]; then
    grep -ai "^$1" "$dir/$letter1"
else
    letter2=$(echo ${1,,}|cut -b2)
    if [ -f "$dir/$letter1/$letter2" ]; then
        grep -ai "^$1" "$dir/$letter1/$letter2"
    else
        letter3=$(echo ${1,,}|cut -b3)
        if [ -f "$dir/$letter1/$letter2/$letter3" ]; then
            grep -ai "^$1" "$dir/$letter1/$letter2/$letter3"
        fi
    fi
fi

如何重写代码以搜索多达50个子文件夹,直到找到包含要grep的文件的最后一个子文件夹?

gpnt7bae

gpnt7bae1#

因此,累积地构建路径,一次一个斜线和字母。

input=${1,,}
path="$dir"
for ((i = 0; i < ${#input}; ++i)); do
    letter=${input:i:1}
    path="$path/$letter"
    if [[ -f "$path" ]]; then
        grep -ai "^$1" "$path"
    fi
done

相关问题