自定义搜索路径的类似行为

时间:2014-06-11 18:34:00

标签: bash path

我正在编写一个将解析配置文件的bash脚本。此配置文件将指定某些文件,我想在某些目录集中搜索这些文件。我或多或少想要which的行为,除了我希望它在我自己的目录列表中搜索不可执行的文件。

考虑到这种情况出现的频率(which,编译器的包含和库搜索路径),我希望存在一些现有的机制来完成这项任务。

find几乎会做我正在寻找的事情,除了它会在绝对路径上窒息(即find /home/foo/bar -name /usr/local/thing.baz无法工作)。

which将完全符合我的要求,但它只会找到可执行文件。

如果不在bash中编写完整(可能更慢)的搜索例程,我将如何完成此任务?

编辑:

受欢迎的需求,有几个例子

#Finds ./foo.a
Library foo.a

#Finds ./libraries/bar.a
Library bar.a

#Finds $MYPATH/default.b
Library default.b

#Finds $MYPATH/exampleLibraries/demo.a
Library demo.a

#Finds /home/john/program/baz.qux
Library /home/john/program/baz.qux

我会有一个变量,例如MYLIBPATHS=$MYPATH:$MYPATH/exampleLibraries:./:./libraries:./things,其中包含可能要查看的完整列表。

如果找不到,我需要一个错误;如果确实找到了,我需要[第一个]文件的绝对路径。

2 个答案:

答案 0 :(得分:0)

你尝试过命令吗?

找到男人

OR

您是否可以在FIND命令中找到 -wholename 选项:

[jenkins@giga_aks ]$ find -name "*.sh"
./tomcat/1.sh
./tomcat/startTomcat.sh
./tomcat/startTomcat-mg.sh
./tomcat/stopTomcat.sh
./build/thidsDist/bin/deploy.sh
./compile.sh
./bin/deploy.sh
./bin/project_properties.sh
./bin/build.sh
./bin/testrunner.sh
./bin/common.sh
./src/deploy/deploy-template.sh
[jenkins@giga_aks ]$

这将仅显示在我当前pwd文件夹位置

中的tomcat文件夹下
[jenkins@giga_aks ]$ find -wholename  ".\/tomcat\/*.sh"
./tomcat/1.sh
./tomcat/startTomcat.sh
./tomcat/startTomcat-mg.sh
./tomcat/stopTomcat.sh
[jenkins@giga_aks ]$

答案 1 :(得分:0)

这是一个次优的答案,因为我想避免用bash写一些东西。但是,如果有人偶然发现了这个问题,以下内容将会起作用并且是我最终使用的解决方案:

    function find_file {
            if [[ "$@" = /* && -f "$@" ]]; then
                    echo "$@"
                    return 0
            fi

            for p in "${MY_PATHS[@]}"; do
                    f="$p/$@"
                    if [[ -f "$f" ]]; then
                            echo "$f"
                            return 0
                    fi
            done

            echo "ERROR: could not locate File \"$@\"" >&2
            return 1
    }

这可以由absolute_file="$(find_file "$file")"使用。