我正在编写一个将解析配置文件的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
,其中包含可能要查看的完整列表。
如果找不到,我需要一个错误;如果确实找到了,我需要[第一个]文件的绝对路径。
答案 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
文件夹位置
[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")"
使用。