如何在目录路径中找到(使用 bash)具有特定名称的顶级文件?

问题描述 投票:0回答:1

我有一个运行 mysql 脚本的 bash 脚本,它从文件中获取 mysql 数据库名称,而不是让我将其作为选项输入(这样我就不会错误地输入错误的名称)。我通过将 mysql 数据库名称放入名为 mysql_db_name 的文件中来设置此设置,该文件要么与我正在运行的脚本位于同一目录中,要么位于其目录路径中该目录之上的某个位置:它可能位于父目录、父目录的父目录中等. 当我输入时,这个 bash 脚本会运行 mysql 脚本:

bash_script mysql_script_name

我想让我的 bash 脚本在 mysql_script_name 脚本的路径中找到名为 mysql_db_name 的顶级文件。

我当前执行此操作的代码片段是:

MFILE=`find / -exec bash -c '[[ $PWD != "$1"* ]]' bash {} \; -prune -name mysql_db_name -print`

这通常有效,但如果父目录中存在另一个目录,其中包含名为 mysql_db_name 的文件,且该文件的目录名是当前目录名的子集,则该方法无效。例如,如果存在:

parent/directory1/mysql_db_name
parent/directory11/mysql_db_name
parent/directory11/mysql_script_name.sql

然后,如果我尝试在

mysql_script_name
中运行
directory11
,bash_script 将失败。如果上面的
directory1
被命名为
directory2
,它就不会失败。

这个问题类似于使用 bash 在目录树中按名称查找文件,但我无法让这些解决方案发挥作用。

bash find
1个回答
0
投票

如果您知道文件名及其所在的目录路径,那么无论如何都没有合理的理由在这里使用

find

path=/path/to/deepest/possible/dir/containing/the/file
while [ "$path" ]; do
    test -e "$path/mysql_db_name" && break
    path=${path%/*}
done
test -e "$path" || { echo "$0: mysql_db_name not found" >&2; exit 2;}
: proceed to use "$path"
© www.soinside.com 2019 - 2024. All rights reserved.